本文目录导读:

PHP面向对象设计原则主要包括以下经典原则,它们通常被称为 SOLID 原则,以及其他一些重要的面向对象最佳实践:
核心:SOLID 原则
这是最基础、最核心的五个原则:
-
单一职责原则
- 核心思想: 一个类应当只有一个引起它变化的原因,即一个类只负责一项明确的职责。
- PHP 示例: 一个
Order类不应该同时处理订单计算、数据库保存和发送邮件,应该拆分为OrderCalculator、OrderRepository和MailService。 - 好处: 提高内聚性,降低复杂性,降低变更风险。
-
开闭原则
- 核心思想: 对扩展开放,对修改封闭,即软件实体(类、模块、函数)应该在不修改原有代码的基础上进行扩展。
- PHP 示例: 使用接口或抽象类定义行为,再通过不同的子类实现具体功能,定义一个
PaymentMethod接口,然后创建Alipay、WeChatPay、CreditCardPay类,而不是在Order类中使用if...else判断支付方式。 - 实现方式: 多态、策略模式、模板方法模式等。
-
里氏替换原则
- 核心思想: 所有引用父类的地方必须能透明地使用其子类的对象,子类可以扩展父类的功能,但不能改变父类原有的功能。
- PHP 示例:
Bird类有fly()方法,Penguin(企鹅)类继承它时,不应该覆盖fly()抛出异常(因为企鹅不会飞),否则违反了里氏替换原则,更好的做法是抽象出Flyable接口,让能飞的鸟类实现它。 - 好处: 确保继承的合理性,避免滥用继承。
-
接口隔离原则
- 核心思想: 客户端不应该依赖它不需要的接口,一个接口应该尽可能小,只包含调用方需要的方法。
- PHP 示例: 不要设计一个臃肿的
Worker接口包含eat()、work()、sleep(),而是拆分为Workable(包含work())、Eatable(包含eat())、Sleepable(包含sleep())等多个小接口,机器人只需要实现Workable,人类可以实现全部。 - 好处: 降低耦合,提高灵活性。
-
依赖倒置原则
- 核心思想: 高层模块不应该依赖低层模块,两者都应该依赖其抽象(接口或抽象类);抽象不应该依赖细节,细节应该依赖抽象。
- PHP 示例: 业务层(
OrderService)不应该直接依赖于数据库层(MysqlDatabase),而是依赖于一个数据库接口(DatabaseInterface)。MysqlDatabase和RedisDatabase都实现该接口,通过依赖注入将具体数据库传给OrderService。 - 好处: 解耦,使得系统更容易替换、测试和扩展。
其他重要的面向对象原则
除了 SOLID,在 PHP 开发中还经常遵循以下原则:
-
组合优于继承
- 核心思想: 尽量使用组合或聚合(即对象持有另一个对象的引用)来实现代码复用,而不是通过继承。
- 原因: 继承会破坏封装性,并且继承层级过深会变得脆弱,组合更灵活,可以在运行时改变行为。
- PHP 示例: 一个
Car类内部持有Engine对象,而不是Car继承Engine。
-
最少知识原则(迪米特法则)
- 核心思想: 一个对象应该对其他对象有最少了解,一个类应尽量少地与其他类发生交互,只与直接朋友通信。
- PHP 示例: 在方法内部,不要链式调用深入获取对象的内部状态(
$user->getAddress()->getCity()),而应该由$user直接提供一个getCityName()方法。 - 好处: 降低类之间的耦合,提高模块独立性。
-
好莱坞原则
- 核心思想: “不要打电话给我们,我们会打给你”,即控制反转(IoC)。
- PHP 示例: 框架(如 Laravel、Symfony)提供事件调度或依赖注入容器,你的控制器不需要主动去创建或查找服务,而是由框架(好莱坞)在需要时调用(注入)你的代码。
-
无环依赖原则
- 核心思想: 在包的依赖关系图中,不允许出现环,即 A 依赖 B,B 依赖 C,C 不能依赖 A。
- 后果: 出现环会导致系统耦合度高,难以维护和测试,甚至导致循环引用。
- 解决方案: 引入接口或抽象类,通过依赖倒置打破循环。
- 首要目标: 高内聚(一个类专注于一件事)、低耦合(类之间联系弱)。
- 核心工具: 接口(
interface)、抽象类(abstract class)、依赖注入(Dependency Injection)。 - 日常实践: 多写接口、少用
if-else/switch判断类型、多用组合、避免深度继承树。
在 PHP 开发(尤其是使用 Laravel 或 Symfony 等主流框架)中,SOLID 和 依赖注入 是最常见且最重要的原则。