php设计模式六大原则
封面图
•
2025-10-13
•
PHP
162
0
0
0
PHP 中的设计模式六大原则,也称为 **SOLID 原则**,是面向对象编程中非常重要的设计指导原则。这些原则由 Robert C. Martin(Bob Martin)提出,用于提高软件的可维护性、可扩展性和灵活性。 以下是 **SOLID 原则的六个核心原则**: --- ### 1. **单一职责原则(Single Responsibility Principle, SRP)** > 一个类应该只有一个引起它变化的原因。 **含义**:每个类或方法只负责一项职责,避免一个类承担过多功能,这样可以降低耦合度,提高可维护性。 **示例**: ```php // 不好的做法:一个类处理用户数据和发送邮件 class User { public function save() { /* 保存用户数据 */ } public function sendEmail() { /* 发送邮件 */ } } // 好的做法:拆分成两个类 class User { public function save() { /* 保存用户数据 */ } } class EmailService { public function send(User $user) { /* 发送邮件 */ } } ``` --- ### 2. **开闭原则(Open/Closed Principle, OCP)** > 软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。 **含义**:在不修改已有代码的前提下,通过扩展来增加新功能。 **示例**: ```php // 不好的做法:直接修改类来添加新功能 class Shape { public function draw($type) { if ($type === 'circle') { // 画圆 } else if ($type === 'square') { // 画正方形 } } } // 好的做法:使用继承和多态 interface Shape { public function draw(); } class Circle implements Shape { public function draw() { /* 画圆 */ } } class Square implements Shape { public function draw() { /* 画正方形 */ } } ``` --- ### 3. **里氏替换原则(Liskov Substitution Principle, LSP)** > 子类应该能够替换其父类,并且不会破坏程序的正确性。 **含义**:子类必须能够完全替代父类,不能破坏原有逻辑。 **示例**: ```php // 父类 class Bird { public function fly() { echo "Bird is flying"; } } // 子类 class Penguin extends Bird { public function fly() { throw new Exception("Penguin can't fly"); } } // 使用时应避免直接使用子类替换父类 $bird = new Penguin(); $bird->fly(); // 抛出异常,违反 LSP ``` --- ### 4. **接口隔离原则(Interface Segregation Principle, ISP)** > 客户端不应该依赖它不需要的接口。 **含义**:不要让一个类实现它不需要的方法,应该将大接口拆分为更小、更具体的接口。 **示例**: ```php // 不好的做法:一个大接口 interface Worker { public function work(); public function eat(); } // 好的做法:拆分成两个接口 interface Workable { public function work(); } interface Eatable { public function eat(); } class Employee implements Workable, Eatable { public function work() { /* 工作 */ } public function eat() { /* 吃饭 */ } } ``` --- ### 5. **依赖倒置原则(Dependency Inversion Principle, DIP)** > 高层模块不应该依赖低层模块,两者都应该依赖抽象;抽象不应该依赖细节,细节应该依赖抽象。 **含义**:依赖接口或抽象类,而不是具体实现。 **示例**: ```php // 不好的做法:高层模块依赖低层模块 class Database { public function connect() { /* 连接数据库 */ } } class UserService { private $db; public function __construct() { $this->db = new Database(); // 直接依赖具体类 } } // 好的做法:依赖抽象 interface DatabaseInterface { public function connect(); } class MySQLDatabase implements DatabaseInterface { public function connect() { /* 连接MySQL */ } } class UserService { private $db; public function __construct(DatabaseInterface $db) { $this->db = $db; // 依赖抽象 } } ``` --- ### 6. **迪米特法则(Law of Demeter, LOD)** > 一个对象应该对其他对象保持最少的了解。 **含义**:一个类只与它直接相关的类进行交互,避免“链式调用”(如 `a.b.c.d`)。 **示例**: ```php // 不好的做法:链式调用 $user->getAddress()->getCity()->getName(); // 好的做法:封装逻辑 class User { public function getCityName() { return $this->address->city->name; } } ``` --- ### 总结 | 原则 | 英文名 | 说明 | |------|--------|------| | 单一职责 | SRP | 一个类只做一件事 | | 开闭原则 | OCP | 对扩展开放,对修改关闭 | | 里氏替换 | LSP | 子类能替换父类 | | 接口隔离 | ISP | 客户端不依赖不需要的接口 | | 依赖倒置 | DIP | 依赖抽象,不依赖具体实现 | | 迪米特法则 | LOD | 一个类只与直接相关类交互 | --- 这些原则不是硬性规定,而是指导思想,帮助你在 PHP 或其他语言中编写更清晰、可维护、可扩展的代码。
上一篇:
PHP session和cookie介绍
下一篇:
PHP自动加载器(Autoloader)
标题录入,一次不能超过6条
返回顶部
留言
留言
评论