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

下载本文档

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

文档简介

PHP中级面试题及详细答案(企业真实版)说明:本套面试题适配2-4年PHP开发中级工程师,贴合日常业务开发、项目优化、线上问题排查场景,无理论空话,答案贴合企业面试标准,适用于面试刷题、内部考核。一、PHP核心基础(必考)1、说说PHP中static、self、parent、this的区别和使用场景参考答案:$this:代表当前类的实例对象,只能在类的非静态方法中使用。用于调用当前对象的属性、普通方法,无法访问静态属性和静态方法。self:代表当前类,属于静态绑定。不管是否被继承,始终指向当前定义代码的类,常用于调用本类的静态属性、静态方法、类常量,不能调用实例属性。parent:代表父类,用于子类调用父类的构造方法、静态方法、普通方法、常量,解决子类重写方法后覆盖父类逻辑的问题。static:代表静态延迟绑定,运行时确定指向的类。和self最大的区别是,继承场景下,static会指向最终调用的子类,而非定义代码的父类,常用于继承场景下的静态方法、静态属性调用。实战总结:实例方法用$this,本类静态资源用self,调用父类逻辑用parent,继承多态静态调用用static。2、PHP常量、变量、静态变量的区别,静态变量的使用场景参考答案:普通变量:函数执行结束后自动销毁,每次调用函数都会重新初始化,数据不保留。静态变量(static局部变量):仅第一次调用时初始化,函数执行结束后变量值不销毁,会保留上一次的值,常驻内存,脚本执行结束才释放。仅在当前函数内有效。常量:一旦定义无法修改、无法销毁,全局可访问,区分大小写,仅支持标量数据(字符串、数字、布尔、null)。静态变量使用场景:接口请求次数统计、函数递归计数、单次脚本内重复调用函数的数据缓存、避免重复初始化配置等。3、PHP传值和传引用的区别,什么场景必须用引用传递参考答案:传值:默认传递方式,会复制一份变量值传给函数,函数内部修改参数,不会影响外部原变量,占用额外内存,数据量大时效率低。传引用(&):传递变量的内存地址,不复制数据,函数内部修改参数会直接改变外部原变量,内存占用低,效率更高。必须使用引用的场景:需要在函数内修改原数组、原变量数据,无需返回值接收;处理超大数组、大字符串,避免数据复制造成内存溢出、性能损耗;批量处理数据、递归修改数据源等场景。4、PHPisset、empty、is_null的区别参考答案:isset():检测变量是否存在且不为null。变量未定义、值为null时返回false,0、''、[]、false都返回true。常用于判断变量、数组键是否存在。empty():检测变量是否为空。0、''、[]、false、null、未定义变量都判定为空,返回true。适合判断表单空值、空数组、空参数。is_null():仅检测变量值是否严格为null,只有变量为null时返回true,其余所有情况均返回false。开发规范:判断参数是否存在用isset,判断参数是否有效非空用empty。5、PHP魔术方法常用场景,重点说明__construct、__destruct、__get、__set、__autoload参考答案:__construct():构造方法,实例化对象时自动执行,用于初始化属性、连接数据库、加载配置。__destruct():析构方法,对象销毁前自动执行,用于关闭数据库连接、释放文件资源、清理缓存。__get($name):访问类中不存在或私有属性时自动触发,用于统一拦截属性读取,做权限校验、默认值赋值。__set($name,$value):给不存在或私有属性赋值时自动触发,用于统一过滤、校验赋值数据。__autoload():自动加载类方法,实例化未引入的类时自动触发,无需手动require/include,实现类文件自动引入,现代项目已被composer自动加载替代。二、PHP面向对象(中级核心)1、面向对象三大特性,结合业务说明实际应用参考答案:封装:将属性和方法封装到类中,私有化属性,通过公有方法对外提供操作接口。

业务场景:用户类私有化手机号、密码,通过get/set方法脱敏、加密处理,避免外部随意篡改核心数据。继承:子类继承父类的属性和方法,实现代码复用,减少重复开发。

业务场景:项目基础控制器封装通用登录校验、权限判断、返回统一格式,前台、后台控制器继承基础控制器,直接复用通用逻辑。多态:子类重写父类方法,同一个方法在不同子类中有不同实现。

业务场景:支付接口父类定义统一支付方法,微信支付、支付宝支付子类分别重写支付逻辑,适配不同支付渠道。2、抽象类和接口的区别,各自使用场景参考答案:核心区别:抽象类:可以有普通方法、抽象方法、成员属性、常量,支持单继承,子类只能继承一个抽象类。接口:只能有常量和抽象方法(PHP7.4前),PHP8支持默认方法,无成员属性,支持多实现,一个类可以实现多个接口。使用场景:抽象类:多个类有大量重复通用逻辑,仅部分方法逻辑不同,需要复用代码时使用。接口:只定义统一规范,不关心具体实现,需要统一方法标准、支持多维度规范约束时使用(如统一支付、统一日志、统一缓存接口)。3、PHP命名空间的作用和使用注意事项参考答案:作用:解决类、函数、常量命名冲突问题,实现代码模块化、层级化管理,适配composer自动加载规范。注意事项:命名空间声明必须在脚本最顶部,除空白字符、注释外无前置代码;命名空间路径需和目录路径保持一致,符合PSR4自动加载规范;跨命名空间调用类,需use引入或使用完整命名空间绝对路径;支持别名引入,解决同类名类库冲突问题。三、MySQL数据库(业务高频)1、索引的分类、失效场景,日常优化手段参考答案:索引分类:主键索引:唯一且非空,一张表只能有一个;唯一索引:字段值唯一,允许一个null值;普通索引:最基础索引,无唯一性约束,提升查询效率;联合索引:多个字段组合索引,遵循最左前缀原则;全文索引:针对大文本字段模糊查询优化。索引失效常见场景:联合索引不满足最左前缀原则;索引字段使用函数、运算、模糊查询前置%(如%xxx);字段类型隐式转换(字符串和数字对比);or前后字段无全部建立索引;数据量过少、索引选择性极低,MySQL放弃索引走全表扫描。日常优化:高频查询字段建索引,避免过度建索引(影响写入性能);遵循最左前缀原则设计联合索引;避免索引字段做运算、函数处理;使用explain分析SQL执行计划,排查失效索引、慢查询。2、InnoDB和MyISAM的核心区别参考答案:事务支持:InnoDB支持事务、ACID、事务回滚;MyISAM不支持事务。锁机制:InnoDB支持行级锁、表级锁;MyISAM只有表级锁,并发写入性能差。外键:InnoDB支持外键约束;MyISAM不支持。崩溃恢复:InnoDB有redo/undo日志,断电可恢复数据;MyISAM崩溃易损坏数据。场景适配:InnoDB适用于增删改频繁、并发高、需要事务的业务(订单、用户、支付);MyISAM适用于只读、查询多、静态数据(文章归档、日志统计)。3、MySQL事务四大特性、隔离级别及问题参考答案:事务四大特性ACID:原子性:事务要么全部执行成功,要么全部回滚;一致性:事务执行前后数据整体约束一致;隔离性:多个事务之间相互隔离,互不干扰;持久性:事务提交后,数据永久落地,断电不丢失。四大隔离级别(从低到高):读未提交:存在脏读、不可重复读、幻读;读已提交(MySQL默认):解决脏读,存在不可重复读、幻读;可重复读:解决脏读、不可重复读,存在幻读;串行化:解决所有问题,事务串行执行,性能最低。4、SQL注入原理及PHP防护方案参考答案:原理:用户可控参数未做过滤,直接拼接SQL语句,攻击者通过构造恶意参数,篡改SQL逻辑,实现脱库、删表、查数据。PHP防护方案:优先使用PDO/MySQLi预处理语句+参数绑定,彻底杜绝拼接;关闭PHP魔术引号,手动过滤特殊字符;严格校验参数类型、正则匹配参数格式;数据库账号最小权限配置,禁止root账号对接业务;框架层面开启SQL过滤机制(ThinkPHP/Laravel默认防护)。四、Redis缓存(中级必备)1、Redis常用数据类型及业务场景参考答案:String字符串:缓存用户信息、配置、验证码、计数器、接口限流;Hash哈希:存储结构化数据,如用户详情、商品信息,比String更节省内存,支持单独字段更新;List列表:有序队列、消息队列、文章列表、秒杀排队;Set集合:无序去重,适用于点赞、收藏、好友列表、数据去重;ZSet有序集合:带权重排序,适用于排行榜、延时队列、积分排名;2、缓存穿透、缓存击穿、缓存雪崩的解决方案参考答案:1、缓存穿透问题:查询数据库不存在的数据,缓存无数据,每次请求都直达数据库,压垮DB。

解决方案:空值缓存、布隆过滤器、接口参数校验、限流拦截非法请求。2、缓存击穿问题:热点key过期瞬间,大量并发请求直达数据库。

解决方案:热点key永不过期、互斥锁(Redis分布式锁)、缓存预热。3、缓存雪崩问题:大量key同时过期、Redis宕机,所有请求直达数据库。

解决方案:过期时间加随机值、Redis集群高可用、多级缓存、服务熔断降级、限流。五、框架与实战开发(ThinkPHP/Laravel通用)1、简述MVC架构思想,各自职责参考答案:MVC是分层开发架构,核心是职责分离、解耦代码,方便维护和迭代。M(Model模型):负责数据层,处理数据库增删改查、数据校验、业务数据逻辑;V(View视图):负责展示层,渲染页面、返回数据、展示结果(前后端分离项目中为接口返回JSON数据);C(Controller控制器):负责调度层,接收请求、校验参数、调用模型、返回结果,不写复杂业务逻辑。2、框架中GET、POST请求区别,如何安全接收参数参考答案:GET:参数拼接在URL中,长度有限、可缓存、不安全,用于查询类请求;POST:参数在请求体中,无长度限制、不可缓存、相对安全,用于提交、修改、新增数据。安全接收参数方式:使用框架自带请求类接收参数,强制参数类型校验,过滤非法字符,禁止直接使用$_GET、$_POST原生变量,防止参数污染和注入。3、谈谈你对RESTful接口规范的理解参考答案:RESTful是前后端分离通用接口设计规范,通过请求方式区分操作,URL定义资源。GET:查询资源;POST:新增资源;PUT/PATCH:修改资源;DELETE:删除资源;规范特点:URL名词化、无动词,统一返回格式(状态码、提示信息、数据体),适配前后端分离开发。六、PHP安全与性能优化(进阶高频)1、PHP常见安全漏洞及修复方式参考答案:SQL注入:使用预处理绑定参数,禁止SQL拼接;XSS跨站脚本攻击:前端输出转义、PHP后端过滤脚本标签、设置CSP响应头;CSRF跨站请求伪造:开启表单令牌验证、校验请求来源Referer、绑定cookie标识;文件上传漏洞:校验文件后缀、MIME类型、二次验证、上传目录禁止执行权限、重命名文件;目录遍历漏洞:过滤../特殊路径,限制文件读取目录范围。2、PHP代码性能优化手段参考答案:减少数据库查询,合理使用Redis缓存、静态缓存;避免循环内嵌套SQL查询、循环内创建对象;使用批量查询、批量更新替代循环单条操作;合理使用静态变量、常量,减少重复计算;开启OPcache缓存PHP脚本,提升脚本解析速度;销毁无用大变量,释放内存,避免内存溢出;拆分耗时逻辑,使用队列异步处理(消息队列替代同步执行)。七、线上实战场景题(压轴面试题)1、线上接口响应慢,你如何排查问题?参考答案:按从外到内、从易到难的顺序排查:查看服务器状态:CPU、内存、磁盘IO、带宽是否打满;排查PHP日志:查看报错日志、慢脚本日志,定位超时代码;排查MySQL慢查询:通过slowlog、explain分析低效SQL,优化索引、改写SQL;排查缓存问题:缓存失效、缓存击穿导致大量请求打DB;排查第三方接口:接口调用

温馨提示

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

评论

0/150

提交评论