PHP设计模式:示例与应用

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

PHP中的设计模式:它们是什么以及为什么需要它们?



设计模式(design patterns)是面向对象编程中典型问题的经过验证的解决方案。它们不是现成的代码,而是可以针对特定情况进行调整的模板。在PHP中,设计模式对于创建可扩展和可维护的Web应用程序特别有用。



在本文中,我们将分析三种主要设计模式:Singleton、Factory和Observer。对于每种模式,我们将提供PHP中的实际示例,并解释在哪些情况下应该使用它们。



为什么要在PHP中学习设计模式?

  • 简化代码 — 统一的方法来解决问题。
  • 可重用性 — 设计模式可以轻松适应不同的项目。
  • 易于维护 — 代码对其他开发人员来说变得易于理解。
  • 可测试性 — 使用设计模式简化了编写单元测试。


1. Singleton模式(单例)



Singleton确保一个类只有一个实例,并提供一个全局访问点。在PHP中,这通常用于数据库连接、日志记录或配置。



示例:数据库操作类



<?phpclass Database {    private static ?Database $instance = null;    private PDO $connection;

private function __construct() { // 连接到数据库(SQLite示例) $this->connection = new PDO('sqlite:example.db'); $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); }

public static function getInstance(): Database { if (self::$instance === null) { self::$instance = new self(); } return self::$instance; }

public function getConnection(): PDO { return $this->connection; }

// 禁止克隆和反序列化 private function __clone() {} public function __wakeup() { throw new \\Exception("Cannot unserialize singleton"); }}

// 使用$db = Database::getInstance();$pdo = $db->getConnection();?>


何时使用Singleton?

  • 当只需要一个类实例时(例如,数据库连接)。
  • 用于全局访问资源(日志记录器、缓存)。
  • 在创建多个实例会导致冲突的情况下。


缺点:违反了单一职责原则,并使测试复杂化(创建了全局状态)。



2. Factory模式(工厂)



Factory Method(工厂方法)定义了一个创建对象的接口,但允许子类更改所创建对象的类型。当对象类型事先未知或可能发生变化时,这很有用。



示例:创建通知的工厂



<?php// 所有通知类型的接口interface Notification {    public function send(string $message): void;}

// 具体实现class EmailNotification implements Notification { public function send(string $message): void { echo "发送email: {$message}"; }}

class SMSNotification implements Notification { public function send(string $message): void { echo "发送SMS: {$message}"; }}

// 工厂class NotificationFactory { public static function create(string $type): Notification { return match ($type) { 'email' => new EmailNotification(), 'sms' => new SMSNotification(), default => throw new \\InvalidArgumentException("未知类型: {$type}"), }; }}

// 使用$notification = NotificationFactory::create('email');$notifica

博客

书籍推荐