PHP设计模式:不只是时髦词汇,而是你编写整洁代码的工具
\n\n每位PHP开发者迟早都会遇到代码变成“意大利面条”的情况:类变得臃肿,依赖关系混乱,添加新功能需要重写半个项目。熟悉吗?
\n正是在这里,PHP设计模式(design patterns)——经过时间考验的典型问题架构解决方案——可以帮到你。它们不是现成的库或可以复制的代码片段。它们是帮助组织应用程序结构的概念,使代码灵活、可测试且易于维护。
\n在本文中,我们不会为了理论而讨论理论。我们将查看真实的PHP代码示例,并回答关键问题:“这个模式何时真正需要,何时只会让事情变得更复杂?”
\n\n为什么应该使用PHP设计模式?
\n许多初级开发者认为设计模式是多余的抽象。但实际上,它们解决了三个关键问题:
\n- \n
- 降低耦合度(loose coupling)——类之间的依赖减少,从而简化替换和测试。 \n
- 提高可复用性——你不需要在不同地方编写相同的代码。 \n
- 简化重构——当需求发生变化(它们总是会变)时,模式允许你局部修改,而不会破坏整个系统。 \n
但有一个注意事项:使用模式需要深思熟虑。如果你有一个只有3张表的简单CRUD应用程序,引入复杂的工厂或抽象构建器就是过度设计。当你预见到复杂性增长,或者当前架构已经开始“出问题”时,使用模式才是合理的。
\n\n五大PHP设计模式及示例
\n\n1. 单例模式(Singleton)——当对象必须唯一时
\n何时使用:你需要整个应用程序中只有一个类实例。经典例子是数据库连接或日志记录器。如果你在每个控制器中创建新连接,可能会耗尽连接限制。
\nclass Database {\n private static ?Database $instance = null;\n private PDO $connection;\n\n private function __construct() {\n $this->connection = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');\n }\n\n // 禁止克隆和反序列化\n private function __clone() {}\n public function __wakeup() {\n throw new \\Exception("Cannot unserialize singleton");\n }\n\n public static function getInstance(): Database {\n if (self::$instance === null) {\n self::$instance = new self();\n }\n return self::$instance;\n }\n\n public function getConnection(): PDO {\n return $this->connection;\n }\n}\n\n// 使用\n$db = Database::getInstance();\n$pdo = $db->getConnection();\n重要提示:单例模式常被批评,因为它创建了全局状态。在现代框架(Laravel、Symfony)中,它被依赖注入容器取代。仅在无DI的简单项目中使用单例模式。
\n\n2. 工厂方法模式(Factory Method)——当对象创建复杂时
\n何时使用:你事先不知道需要创建哪个具体类,或者对象的初始化过程需要多个步骤。例如,创建不同类型的通知(Email、SMS、Push)。
\ninterface Notification {\n public function send(string $message): void;\n}\n\nclass EmailNotification implements Notification {\n public function send(string $message): void {\n echo "发送Email: $message\\n";\n }\n}\n\nclass SMSNotification implements Notification {\n public function send(string $mess