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

下载本文档

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

文档简介

PHP开发面试题及详细答案(实战版)一、PHP基础语法篇1、简述PHP中常量和变量的区别,以及定义方式答案:变量是程序运行中值可以随时修改、销毁的标识符,作用域灵活;常量一旦定义,全程不可修改、不可销毁,生命周期贯穿整个脚本执行过程。定义方式:变量:以$符号开头,如$name='test';常量有两种定义方式:1)define()函数:全局有效,可在条件判断内定义,不区分大小写(默认),示例:define('WEB_NAME','官网');2)const关键字:只能在顶层作用域、类内部使用,不可在函数、条件内定义,严格区分大小写,多用于类常量,示例:constVERSION='1.0';核心区别:const编译阶段加载,效率更高;define()运行阶段加载,灵活性更高。2、PHP中empty、isset、is_null的区别和使用场景答案:这三个函数都是判断变量状态,但是判定逻辑差异很大,也是日常开发高频踩坑点:1)isset():检测变量是否存在且不为null。变量未定义、值为null时返回false;空字符串、0、false、空数组都返回true。多用于判断参数是否传递、变量是否初始化。2)empty():检测变量是否为空值。以下情况均返回true:未定义、null、空字符串、0、0.0、false、空数组、字符串"0"。多用于判断表单、接口参数是否为空。3)is_null():仅判断变量值是否严格为null。只有变量值是null时返回true,其余所有情况均返回false。实战总结:判断参数是否传入用isset,判断参数是否有效为空用empty,精准判空null用is_null。3、PHP传值赋值和引用赋值的区别答案:1)传值赋值:默认赋值方式,新变量会复制原变量的值,两个变量相互独立,修改其中一个,不会影响另一个。示例:$a=1;$b=$a;$b=2;此时$a仍为1。2)引用赋值:使用&符号,新变量和原变量指向同一个内存地址,属于共用值,任意一个变量修改,另一个变量同步变化。示例:$a=1;$b=&$a;$b=2;此时$a的值也变为2。使用场景:大数组、大对象赋值优先用引用,节省内存开销;普通变量赋值用传值,避免数据意外篡改。4、PHP中static静态变量、静态方法的特性答案:静态变量(函数内static):函数执行结束后,变量值不会销毁,保留上一次执行结果,脚本生命周期内持续保存数据,仅第一次调用时初始化。常用于统计函数调用次数、缓存临时数据。静态方法/静态属性(类中static):1)属于类本身,不属于实例化对象,无需new对象,可直接通过类名::方法名调用;2)静态方法中不能使用$this,只能使用self/static;3)所有对象共享静态属性,一处修改,全局生效;4)不能被实例方法覆盖,支持继承。二、面向对象OOP篇1、PHP面向对象三大特性及实际开发应用答案:封装:将属性和方法封装在类内部,通过访问修饰符(public/protected/private)控制访问权限,隐藏内部实现细节,仅对外提供调用接口。应用:统一数据操作规则,防止外部随意修改核心属性,提升代码安全性。继承:子类继承父类的属性和方法,可复用父类代码,支持重写父类方法。应用:搭建公共基础类(如数据库操作、日志类),所有业务类继承复用,减少冗余代码。多态:子类重写父类方法,同一个方法在不同子类中实现不同逻辑,依托接口或父类统一调用。应用:支付场景(微信支付、支付宝支付),统一支付接口,不同支付方式实现各自逻辑。2、private、protected、public、final、static的访问权限区别答案:1)public:公开,类内部、子类、外部代码均可访问;2)protected:受保护,类内部、子类可访问,外部无法访问;3)private:私有,仅当前类内部可访问,子类、外部均不可访问;4)final:修饰类则类不可被继承,修饰方法则方法不可被重写;5)static:静态,归属类而非对象,全局共享,无需实例化调用。3、接口(interface)和抽象类(abstract)的区别答案:1)定义约束:抽象类可以包含普通方法、静态方法、属性、常量;接口只能包含公共抽象方法、常量,无属性、无实现代码;2)继承规则:一个类只能继承一个抽象类(单继承);一个类可以实现多个接口(多实现);3)修饰符:抽象类方法可使用protected/public;接口方法默认public,不可修改;4)使用场景:抽象类用于代码复用+规范,抽取公共业务逻辑;接口用于纯规范约束,统一不同类的调用标准。三、MySQL与数据库优化篇1、MySQL索引的分类、失效场景有哪些答案:索引分类:1)主键索引:唯一且非空,一张表只能有一个;2)唯一索引:字段值唯一,允许为空;3)普通索引:最基础索引,无唯一性约束,提升查询效率;4)联合索引:多个字段组合索引,遵循最左匹配原则;5)全文索引:针对大文本字段做模糊检索。索引常见失效场景:1)联合索引不满足最左匹配原则;2)索引字段使用函数、运算、类型转换;3)like%xxx前置模糊查询,索引失效(xxx%后置模糊可走索引);4)or左右字段有一个无索引,整体索引失效;5)数据量过少、重复值过高(如性别字段),数据库会放弃索引全表扫描;6)in、notin、exists不当使用导致索引失效。2、SQL注入原理及PHP防护方案答案:注入原理:用户恶意构造特殊字符(单引号、or、union等),拼接进SQL语句,改变原有SQL逻辑,实现越权查询、删改数据、脱库等操作。PHP防护方案:1)优先使用PDO/MySQLi预处理语句+参数绑定,彻底杜绝拼接注入,是最安全的方式;2)禁止直接拼接用户参数到SQL语句;3)使用mysql_real_escape_string转义特殊字符(兼容旧项目);4)后端严格参数校验、类型强制转换,限制输入长度;5)数据库账号最小权限配置,禁止root账号对接业务。3、MySQL慢查询优化的常规步骤答案:1)开启慢查询日志,记录执行超时SQL,定位问题语句;2)使用explain分析SQL执行计划,查看是否走索引、扫描行数、是否存在临时表、文件排序;3)针对缺失索引的字段建立合理索引,优化联合索引顺序;4)优化SQL语句,避免select*、避免多余排序分组、优化子查询;5)大表分页优化,避免limit10000,100这种深度分页;6)拆分大SQL、拆分大表(分表分库)、读写分离;7)合理使用缓存,减少数据库重复查询压力。四、PHP框架与实战开发篇(以ThinkPHP/Laravel通用)1、简述MVC架构思想及各层作用答案:MVC是分层开发架构,核心是数据、视图、逻辑分离,解耦代码,方便维护迭代。1)M(Model模型层):负责数据操作,包含数据库增删改查、数据校验、业务数据处理,对接数据库;2)V(View视图层):负责页面展示、数据渲染,返回前端页面、json接口数据;3)C(Controller控制器层):负责接收请求、调度逻辑,接收前端参数、调用模型、返回结果,不写复杂业务和数据操作。进阶:现在主流框架多采用MVCS架构,新增Service服务层,将复杂业务逻辑从控制器拆分,代码更规范。2、TP框架中I/O过滤、请求验证的最佳实践答案:1)禁止直接使用$_GET、$_POST获取参数,统一使用框架自带请求类;2)使用validate验证器统一校验参数规则(必填、类型、长度、正则),替代控制器手动判断;3)开启框架全局过滤,自动转义特殊字符,防止XSS和恶意输入;4)接口参数强制类型转换,数字参数强制int,字符串参数过滤空格;5)敏感接口增加token校验、频率限制,防止恶意刷接口。3、Laravel服务容器、依赖注入的作用答案:服务容器是Laravel的核心,是一个全局对象管理容器,用于统一管理类的实例化、依赖关系。依赖注入是容器的核心特性,无需手动new类,自动解析类的依赖并注入实例。核心作用:1)极大降低代码耦合度,方便单元测试、代码替换;2)统一管理单例、绑定服务,减少重复实例化开销;3)方便功能扩展,通过服务绑定快速替换底层实现。五、PHP安全与性能优化篇1、常见的PHP安全漏洞及修复方式答案:1)SQL注入:使用预处理语句、参数绑定,禁止SQL拼接;2)XSS跨站脚本攻击:前端输出转义、后端过滤脚本标签、开启CSP防护;3)CSRF跨站请求伪造:开启框架CSRF令牌验证,校验请求来源;4)文件上传漏洞:校验文件后缀、MIME类型、文件头,重命名存储文件,禁止上传php可执行文件,上传目录禁止执行权限;5)代码执行漏洞:禁止使用eval、exec、system等危险函数,过滤用户可输入的执行参数;6)权限漏洞:所有接口、页面增加权限校验,禁止越权访问数据。2、PHP性能优化的常用手段答案:代码层面:1)多用静态方法、常量,减少对象实例化;2)避免循环内嵌套查询、循环内创建变量;3)大数组操作使用引用传值,节省内存;4)精简代码逻辑,减少无效判断和运算。配置层面:1)开启OPcache缓存,缓存PHP编译后的字节码,大幅提升运行速度;2)关闭多余扩展、关闭调试模式,减少资源占用。架构层面:1)使用Redis/Memcached缓存热点数据,减少数据库查询;2)页面静态化、接口缓存、队列异步处理耗时任务;3)数据库读写分离、分表分库、优化索引;4)使用Swoole替代传统FPM,提升并发能力。3、PHP-FPM和Swoole的区别答案:1)运行模式:PHP-FPM是同步阻塞模式,每一个请求启动一个进程,请求结束进程销毁,每次请求都要重新初始化框架,开销大;Swoole是常驻进程、异步非阻塞,进程启动后常驻内存,无需重复初始化,并发极高;2)性能:FPM适合普通低并发业务,QPS较低;Swoole支持万级并发,适合接口服务、长连接、定时任务、队列服务;3)功能:FPM仅支持普通HTTP请求;Swoole支持WebSocket、TCP/UDP、异步任务、定时器、协程;4)开发成本:FPM适配所有传统PHP框架,开发简单;Swoole需要适配常驻进程特性,规避内存泄漏问题。六、实战场景面试题1、如何解决PHP高并发秒杀场景的超卖问题?答案:超卖核心原因是多请求同时查询库存,同时执行扣减,无互斥机制。解决方案由浅入深:1)数据库悲观锁:查询库存时加forupdate行锁,锁定数据,防止并发修改,适合低并发;2)数据库乐观锁:通过版本号或库存字段比对,更新时判断库存>0,失败则返回抢购失败;3)Redis预减库存(主流方案):利用Redis单线程特性,先在Redis扣减库存,成功后再异步落库,抗高并发;4)队列削峰:秒杀请求接入Redis队列,排队处理,避免瞬间压垮数据库;5)接口限流:限制用户单次抢购频率、总请求量,拦截无效请求。2、PHP如何处理大批量数据导出(十万级以上),避免内存溢出?答案:常规一次性查询全部数据会导致内存溢出,解决方案:1)采用分页分批查询,每次查询1000-2000条,循环写入文件,不一次性加载所有数据到内存;2)关闭内存限制:ini_set('memory_limit','-1'),同时设置最大执行时间;3)使用PHP原生CSV写入,替代Excel插件,降低内存开销;4)采用异步导出,前端提交任务,后端队列处理,完成后通知用户下载,避免超时;5)批量查询后及时销毁变量,释放内存。3、SESSION和COOKIE的区别,以及SESSION失效原因排查答案:核心区别:1)存储位置:cookie存储在客户端浏览器,session存储在服务端;2)安全性:cookie可被篡改、窃取,安全性低;session数据存在服务端,安全性更高;3)大小限

温馨提示

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

评论

0/150

提交评论