第3章 面向对象编程与设计模式

OOP 三大特性(封装、继承、多态)是 PHP 面试的基石,设计模式考察实战能力,框架应用则检验工程化思维。面试官常从概念深挖到源码实现,再追问架构取舍。

OOP 三大特性 封装 数据隐藏 + 访问控制 降低耦合,提升安全性 继承 代码复用 → 层级关系 避免多层继承,优先组合 多态 接口/抽象类统一调用 运行时动态绑定 设计模式 工厂、策略、观察者 框架内常见实例 回答框架:定义 → 目的 → 代码示例 → 框架应用 → 权衡
面试提示: 回答 OOP 时先给出清晰定义,再举实际代码片段,最后关联 Laravel 中的 Facade(封装)、Eloquent 继承(继承)、Contract 接口(多态)等。

知识结构:常见设计模式与框架应用

类别 设计模式 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 判断。常用于数据库连接、配置类,但避免滥用,否则违背单一职责且难以测试。”

可能追问:“静态属性在协程下如何?”“如何用容器替代单例?”

避坑提醒:不要只写一个 private static $instance + public static getInstance —— 缺少 clone/wakeup 防护;主动说明单元测试时可通过 reset() 或容器 Mock 替代。