第3章 面向对象编程与设计模式
OOP 三大特性(封装、继承、多态)是 PHP 面试的基石,设计模式考察实战能力,框架应用则检验工程化思维。面试官常从概念深挖到源码实现,再追问架构取舍。
知识结构:常见设计模式与框架应用
| 类别 | 设计模式 | Laravel 应用 | ThinkPHP 应用 |
|---|---|---|---|
| 创建型 | 单例、工厂 | Service Container / Facade | 容器绑定 / 实例化管理 |
| 结构型 | 适配器、代理 | Cache 驱动适配 / 中间件 | 驱动扩展 / 行为插件 |
| 行为型 | 策略、观察者 | Event & Listener / Policy | 钩子机制 / 事件系统 |
📌 面试问题 1:请解释封装、继承、多态,并各举一个 PHP 例子。
面试官考察点:基础概念是否扎实,能否结合 PHP 语法(访问控制、extends、interface)举例。
回答框架:分别给出定义 → 目的 → PHP 代码片段 → 利弊权衡。
示例回答:“封装:用 private/protected 隐藏内部状态,通过 public 方法访问,如 User 类密码字段加密存储。继承:子类 extends 父类复用代码,但应避免多层继承,优先使用 trait 或组合。多态:定义接口或抽象类,多个实现类可替换,如 PaymentGateway::pay() 被不同渠道类实现。”
可能追问:“继承与组合的优缺点?”“PHP 的 trait 解决了什么?”
📌 面试问题 2:你在实际项目中用过哪些设计模式?请结合框架具体说明。
面试官考察点:是否真在项目里用过设计模式,还是只背了理论;框架源码理解程度。
回答框架:点名模式 → 场景描述 → 框架源码位置 → 带来的好处。
示例回答:“在 Laravel 项目中大量使用策略模式:定义接口 PayContract,每个支付渠道实现 handle(),通过容器注入切换。还用了观察者模式实现用户注册后的通知队列,事件类 UserRegistered 触发多个监听器,代码解耦明显。”
可能追问:“工厂模式与依赖注入容器关系?”“如何保证单例不被破坏?”
📌 面试问题 3:设计单例模式需要注意哪些问题?PHP 中如何实现安全的单例?
面试官考察点:多线程/请求安全(PHP 无多线程但需防序列化、克隆)、内存泄漏意识。
回答框架:定义 → 实现步骤(private 构造、禁止 clone、禁止 unserialize)→ 静态方法 → 使用场景。
示例回答:“PHP 单例核心:私有化 __construct 和 __clone,私有化 __wakeup 防止反序列化,静态方法 getInstance() 通过 self::$instance 判断。常用于数据库连接、配置类,但避免滥用,否则违背单一职责且难以测试。”
可能追问:“静态属性在协程下如何?”“如何用容器替代单例?”