设计模式在 PHP 世界中经历了从经典 GoF 模式到现代函数式编程范式的深刻演变。传统上,PHP 开发者学习工厂模式、单例模式、策略模式等经典模式,这些模式在 PHP 5 时代是构建可维护应用的基础。然而,随着 PHP 7 和 PHP 8 引入类型系统、匿名类、闭包、属性和枚举,许多经典模式的实现方式已经发生了根本变化,有些甚至变得不再必要。
参考:https://bgnno.cn/category/guide.html
单例模式是这一演变的典型案例。在 PHP 5 中,单例模式通过私有构造函数、私有克隆方法和静态方法实现,确保一个类只有一个实例。但在现代 PHP 应用中,依赖注入容器已经取代了单例模式的大部分用例。容器负责管理服务的生命周期,单例服务在容器范围内只有一个实例,但不再需要类自身实现单例逻辑。这带来了更好的可测试性,因为依赖关系变得显式而非隐藏在静态方法中。
工厂模式的演变同样显著。传统工厂模式需要一个工厂类,其中包含复杂的条件逻辑来决定实例化哪个具体类。现代 PHP 使用闭包和数组映射来替代条件语句,工厂可以是任何返回对象的可调用实体。同时,PSR-11 容器接口的出现使得工厂可以直接依赖容器,进一步简化了实现。
参考:https://xrzqr.cn/category/travel-advice.html
策略模式在现代 PHP 中获得了新的生命力。枚举的引入使策略的选择更加类型安全,而属性(注解)允许将策略元数据直接附加到策略类上。配合容器,策略可以自动注册和解析,无需手动维护策略列表。这种声明式的方式减少了样板代码,提高了可维护性。
观察者模式被事件分发器所取代。Symfony 的 EventDispatcher 和 Laravel 的事件系统提供了比传统观察者更强大的功能:事件可以携带数据、监听器可以有优先级、事件可以被终止传播。这些系统还支持异步分发,将事件处理推送到队列,提高响应速度。
参考:https://rvxif.cn/category/yellow-tea.html
生成器模式在构建复杂对象时仍然有用,但现代 PHP 使用命名参数和构造器属性提升来减少对建造者的需求。当一个类的构造函数参数超过四五个时,建造者仍然是有价值的选择,特别是当部分参数可选时。
反模式识别:随着现代实践的发展,一些曾经常见的做法现在被视为反模式。静态方法调用隐藏了依赖关系,使代码难以测试。上帝类违反单一职责原则,是重构的主要目标。硬编码依赖使系统僵硬,难以扩展。绕过类型系统的数组滥用导致代码脆弱,IDE 支持差。
现代 PHP 设计模式更加轻量、声明式、与框架深度集成。掌握这些模式不是背诵类图,而是理解问题上下文,选择合适的抽象。过度设计比没有设计更糟糕——只有当模式带来明确的好处时才使用它。
参考:https://xrzqr.cn