PHP高频面试题及详细答案(企业真实版)_第1页
PHP高频面试题及详细答案(企业真实版)_第2页
PHP高频面试题及详细答案(企业真实版)_第3页
PHP高频面试题及详细答案(企业真实版)_第4页
PHP高频面试题及详细答案(企业真实版)_第5页
已阅读5页,还剩4页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PHP高频面试题及详细答案(企业真实版)一、PHP基础语法篇(高频基础题)1、简述PHP中变量传值和引用传值的区别?变量传值是默认传值方式,赋值后两个变量相互独立,修改其中一个变量不会影响另一个变量。系统会为新变量开辟新的内存空间,存储相同的值。引用传值需要使用&符号,赋值后两个变量指向同一个内存地址,本质是别名关系。修改任意一个变量的值,另一个变量会同步变化,不会开辟新内存,更节省资源。示例:php

//值传递

$a=10;

$b=$a;

$b=20;

echo$a;//输出10

//引用传递

$a=10;

$b=&$a;

$b=20;

echo$a;//输出202、PHP常量和变量的区别?常用常量定义方式?区别:变量可重复赋值、可修改、可销毁;常量一旦定义,无法修改、无法销毁。变量作用域灵活,常量默认全局生效,不受作用域限制。变量首字符不能是数字,常量命名通常大写,下划线分隔。定义方式:define():函数定义,全局有效,可在条件判断中定义,支持大小写不敏感设置。const:关键字定义,必须在顶层作用域,不能在函数、循环、条件内定义,编译阶段加载,效率更高。3、empty()、isset()、is_null()的区别?isset():检测变量是否存在且不为null。变量未定义、值为null时返回false,空字符串、0、空数组均返回true。主要用于判断变量是否声明。empty():检测变量是否为空。空字符串、0、0.0、null、false、空数组、未定义变量,都会返回true。主要用于判断变量是否无有效内容。is_null():仅判断变量值是否为纯null,变量未定义会报错,精准判断null值。4、PHP中==和===的区别?==松散比较:只比较值,会自动进行类型转换。例如0==false、''==0、null==''结果均为true。===严格比较:同时比较值和数据类型,类型不一致直接返回false。日常开发优先使用严格比较,避免类型转换带来的bug。5、PHP数据类型有哪些?标量类型包含什么?PHP一共8种原生数据类型:标量类型(4种):整型(int)、浮点型(float)、字符串(string)、布尔型(bool)复合类型(2种):数组(array)、对象(object)特殊类型(2种):null、资源(resource)二、PHP数组与函数核心题1、PHP索引数组和关联数组区别?数组底层原理?索引数组:键名是连续数字,默认从0开始,适合有序数据存储。关联数组:键名是自定义字符串或数字,适合键值对数据存储,是PHP最常用的数组形式。PHP数组底层是哈希表,不是传统有序数组,支持动态扩容、任意键值组合,读写速度极快,但内存占用相对较高。2、常用的PHP数组函数有哪些?(高频实用)增删改查:array_push、array_pop、array_unshift、array_shift键值操作:array_keys、array_values、array_merge、array_replace筛选排序:array_filter、array_map、sort、rsort、ksort、krsort判断查找:in_array、array_key_exists、array_search统计去重:count、array_unique、array_sum、array_count_values3、PHP函数静态变量static的作用?static修饰的局部变量,只会在第一次调用函数时初始化一次,函数执行结束后变量值不会销毁,下次调用函数会沿用上次的值。常用于统计函数调用次数、缓存临时数据,区别于普通局部变量(每次调用重置)。4、全局变量global和$GLOBALS的区别?global:在函数内声明全局变量的引用,只能读取和修改全局变量,不能批量操作。$GLOBALS:超全局数组,存储所有全局变量,可在任意作用域读写、删除全局变量,功能更强大。三、面向对象OOP高频题1、面向对象三大特性及各自作用?封装:将属性和方法封装到类中,通过访问修饰符控制权限,隐藏内部实现细节,只暴露对外接口,提高代码安全性和复用性。继承:子类继承父类的属性和方法,减少重复代码,实现代码复用,支持单继承(PHP类只能继承一个父类)。多态:同一方法在不同子类中有不同实现,依托继承和方法重写,提高代码扩展性,适配不同业务场景。2、PHP访问修饰符public、protected、private区别?public:公共的,任意位置(类内、类外、子类)均可访问。protected:受保护的,仅类内部、子类可以访问,类外无法访问。private:私有的,仅当前类内部可以访问,子类和类外均无法访问。3、构造方法、析构方法的作用及触发时机?构造方法__construct():实例化对象时自动触发,用于初始化成员属性、初始化资源(连接数据库、打开文件等)。析构方法__destruct():对象销毁、脚本执行结束时自动触发,用于释放资源(关闭数据库连接、释放文件指针)。4、接口和抽象类的区别?抽象类:用abstract修饰,可包含普通方法、抽象方法、成员属性,支持单继承,子类必须实现所有抽象方法。接口:用interface修饰,只能包含常量和抽象方法(PHP7前),PHP8支持接口默认方法,支持多实现,用于统一规范、定义行为标准。核心区别:抽象类侧重代码复用,接口侧重行为规范。5、PHP魔术方法常用的有哪些?作用?__get():访问不存在或私有属性时自动触发__set():给不存在或私有属性赋值时自动触发__isset():对不存在/私有属性执行isset判断时触发__unset():销毁不存在/私有属性时触发__call():调用不存在或私有方法时触发__toString():对象被当作字符串输出时触发__clone():对象克隆时触发四、文件与Cookie、Session核心题1、Cookie和Session的区别及优缺点?区别:存储位置:Cookie存储在客户端浏览器,Session存储在服务器端。安全性:Session安全性更高,Cookie易被篡改、窃取。存储大小:Cookie有大小限制(单条4KB左右),Session无严格大小限制。生命周期:Cookie可设置持久化存储,浏览器关闭可保留;默认Session浏览器关闭即失效。联动原理:Session依赖Cookie,首次请求服务器生成SessionID,通过Cookie下发到浏览器,后续请求携带SessionID匹配服务器会话数据。2、Session失效的原因有哪些?浏览器清除Cookie、禁用Cookie,导致无法携带SessionID服务器session过期时间到期,自动回收会话文件手动执行session_destroy()销毁会话服务器重启、临时目录session文件被清理3、PHP文件上传的核心步骤及注意事项?核心步骤:前端表单设置enctype="multipart/form-data"、method="post"后端通过$_FILES获取上传文件信息判断文件上传是否出错、校验文件大小、后缀、MIME类型生成唯一文件名(防止覆盖)通过move_uploaded_file()移动临时文件到正式目录安全注意:禁止直接使用原文件名、校验文件类型、限制文件大小、禁止上传php脚本文件、存储目录禁止执行脚本权限。五、MySQL与数据库优化(PHP面试必考)1、MySQL索引的作用、分类、失效场景?作用:大幅提升查询效率,降低数据库IO,减少扫描行数,但会降低增删改效率(需要维护索引结构)。分类:主键索引、唯一索引、普通索引、联合索引、全文索引。索引失效高频场景:where条件中使用!=、<>、or、isnotnull索引列参与运算、使用函数(substr、date等)字符串字段未加引号、隐式类型转换联合索引不遵循最左匹配原则like%xxx前置通配符2、MySQL事务四大特性(ACID)?原子性(Atomicity):事务要么全部执行成功,要么全部回滚,不可拆分。一致性(Consistency):事务执行前后,数据库数据状态保持一致,约束不被破坏。隔离性(Isolation):多个事务之间相互隔离,互不干扰。持久性(Durability):事务提交成功后,数据永久落地,服务器宕机也不会丢失。3、SQL注入原理及PHP防护方案?原理:用户通过输入框、URL参数等,提交恶意SQL语句,程序未做过滤,直接拼接SQL执行,导致数据泄露、篡改、删除。防护方案:使用预处理语句+参数绑定(PDO/MySQLi预处理),杜绝SQL拼接过滤、转义用户输入,禁用特殊字符数据库账号最小权限配置关闭数据库错误信息暴露,避免泄露表结构4、数据库慢查询优化思路?开启慢查询日志,定位慢SQL语句使用explain分析执行计划,查看索引使用情况优化where条件、避免索引失效场景大表拆分、分库分表,减少单表数据量合理使用缓存(Redis),减少数据库查询次数避免select*,只查询需要的字段六、PHP安全与性能优化1、PHP常见安全漏洞及防护?SQL注入:预处理绑定参数、输入过滤XSS跨站脚本攻击:输出数据转义(htmlspecialchars)、CSP策略CSRF跨站请求伪造:表单令牌token、验证请求来源referer文件上传漏洞:校验文件类型、后缀、禁止脚本执行目录遍历漏洞:过滤../路径符,限制文件访问目录2、PHP代码性能优化方案?优先使用原生函数,原生函数为C语言实现,效率高于自定义函数循环内避免重复计算、重复实例化对象合理使用缓存:页面缓存、数据缓存、Redis缓存热点数据开启OPcache缓存PHP编译字节码,减少重复编译开销销毁无用变量、释放内存,避免内存溢出减少数据库查询,合并SQL语句,避免循环查库七、ThinkPHP/Laravel框架高频面试题1、框架MVC架构的含义?M(Model模型):负责数据层,对接数据库,处理数据增删改查、业务数据逻辑。V(View视图):负责展示层,展示页面、数据渲染,接收用户界面输入。C(Controller控制器):负责调度层,接收请求、调用模型、渲染视图,处理业务逻辑调度。核心作用:代码分层解耦,各司其职,便于维护和迭代。2、TP框架ORM优缺点?优点:语法简洁、开发效率高,支持链式操作、自动验证、自动写入时间戳,适配快速开发。缺点:复杂查询性能不如原生SQL,部分封装会隐藏底层逻辑,新手容易写出低效SQL,大项目需手动优化SQL。3、Laravel服务容器和服务提供者的作用?服务容器是Laravel的核心,负责依赖注入、对象管理,统一管理类的实例化,避免重复new对象,实现代码解耦。服务提供者是服务容器的注册入口,用于注册组件、绑定接口、初始化服务,框架所有核心功能均通过服务提供者启动。八、Redis缓存面试题(PHP后端必备)1、Redis常用数据类型及使用场景?String:字符串,缓存用户信息、配置、验证码、计数器Hash:哈希,存储结构化数据(用户详情、商品信息)List:列表,消息队列、秒杀排队、有序列表Set:集合,去重、好友列表、点赞列表ZSet:有序集合,排行榜、积分排名、延时队列2、缓存雪崩、缓存穿透、缓存击穿的解决方案?缓存穿透:查询不存在的数据,直接穿透到数据库。方案:接口校验、布隆过滤器、空值缓存。缓存击穿:热点key过期,大量请求打垮数据库。方案:互斥锁、热点key永不过期、定时续期。缓存雪崩:大量key同时过期,数据库压力骤增。方案:过期时间加随机值、集群部署、多级缓存、服务熔断降级。九、综合手写题(面试实操)1、手写PHP防止SQL注入的预处理代码(PDO)php

<?php

//数据库连接

$dsn='mysql:host=127.0.0.1;dbname=test;charset=utf8';

$user='root';

$pwd='123456';

try{

$pdo=newPDO($dsn,$user,$pwd);

$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

//预处理绑定参数,杜绝SQL拼接

$sql="SELECT*FROMuserWHEREid=:idANDstatus=:status";

$stmt=$pdo->prepare($sql);

$stmt->execute([':id'=>$_GET['id'],':status'=>1]);

$res=$stmt->fetchAll(PDO::FETCH_ASSOC);

}catch(Exception$e){

die('数据库错误:'.$e->getMessage());

}

?>2、手写简单的单例模式php

<?php

//单例模式:类只能实例化一个对象

classSingleton

{

//私有静态实例

privatestatic$instance;

//

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论