第3章 PHP基础、面向对象、设计模式
本章聚焦分布式系统面试中高频考察的PHP语言核心知识,包括内存管理、OOP实战和设计模式在分布式环境下的适配。面试官常通过基础问题判断候选人对语言特性的理解深度及工程化思维。下方以“回答框架图”展示结构化应答路径,再通过三个典型问答卡片拆解答题策略。
面试问题:谈谈PHP的垃圾回收机制?
- 考察点:内存管理理解、版本演进、循环引用处理。
- 回答框架:引用计数基础 → 循环引用问题 → 同步周期回收算法(5.3+) → 触发条件。
- 示例回答:PHP使用引用计数,每个zval有refcount,0时销毁;但循环引用导致内存泄漏。PHP 5.3引入同步周期回收,通过根缓冲区(root buffer)定期标记清除;7.0起优化为引用计数+写时复制,减少根缓冲区压力。
- 可能追问:gc_collect_cycles()何时调用?数组的refcount如何工作?
- 避坑提醒:不要只答“引用计数”,必须主动提及循环回收算法和版本差异。
面试问题:面向对象三大特性在实际项目中的应用?
- 考察点:OOP工程化能力、抽象封装理解、接口与继承的权衡。
- 回答框架:封装(数据保护)→ 继承(复用+扩展)→ 多态(接口统一调用)→ 真实项目举例。
- 示例回答:封装:User类私有密码字段,通过setPassword加盐处理;继承:BaseModel提供公共CRUD子类扩展;多态:支付接口定义pay(),微信/支付宝实现不同逻辑,调用端无需关心具体实现。
- 可能追问:接口和抽象类的使用场景区别?trait的作用?
- 避坑提醒:避免只背定义,要结合自己项目细节说明如何“用”,比如具体类名、方法。
面试问题:单例模式在分布式系统中需要注意什么?
- 考察点:设计模式局限性、分布式思维、序列化/反序列化安全。
- 回答框架:单例定义(单进程有效)→ 分布式各进程独立实例 → 共享状态方案(Redis/DB) → 防止序列化破坏。
- 示例回答:单例默认每个PHP-FPM子进程一个实例,无法跨进程共享。在分布式下需配合Redis存储状态实现全局唯一;同时需重写__wakeup()或__clone()防止反序列化破坏单例;最佳实践是结合容器管理生命周期。
- 可能追问:如何用Redis实现分布式锁保证单例?PHP中序列化破坏单例的具体原理?
- 避坑提醒:切勿只说“单例模式没问题”,一定要讨论分布式场景的失效和解决方案。