本文目录导读:

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 和 依赖注入 是最常见且最重要的原则。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播