«

PHP 常用设计模式

时间:2026-10-7 07:11     作者:emer     分类: 无


PHP 常用设计模式

设计模式不是玄学,是前人踩坑总结出来的套路。这篇讲 PHP 开发中最常用的几个。

1. 单例模式(最常用)

保证一个类只有一个实例,节省资源。

class Database
{
    private static $instance = null;
    private $pdo;

    // 构造函数私有化,禁止外部 new
    private function __construct()
    {
        $this->pdo = new PDO('mysql:host=127.0.0.1;dbname=blog', 'root', '123456');
    }

    // 禁止克隆
    private function __clone() {}

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

    public function query($sql)
    {
        return $this->pdo->query($sql);
    }
}

// 使用
$db = Database::getInstance();
$db->query("SELECT * FROM users");

适用场景: 数据库连接、日志类、配置类。

2. 工厂模式

根据参数创建不同对象,不用直接 new。

interface Logger
{
    public function write($message);
}

class FileLogger implements Logger
{
    public function write($message)
    {
        file_put_contents('log.txt', $message . "\n", FILE_APPEND);
    }
}

class DatabaseLogger implements Logger
{
    public function write($message)
    {
        // 写入数据库
    }
}

class LoggerFactory
{
    public static function create($type)
    {
        switch ($type) {
            case 'file':
                return new FileLogger();
            case 'database':
                return new DatabaseLogger();
            default:
                throw new Exception("不支持的日志类型");
        }
    }
}

// 使用
$logger = LoggerFactory::create('file');
$logger->write("这是一条日志");

3. 观察者模式

对象状态变化时自动通知依赖它的对象。

interface Observer
{
    public function update($event);
}

class Order
{
    private $observers = [];

    public function addObserver(Observer $observer)
    {
        $this->observers[] = $observer;
    }

    public function pay()
    {
        // 支付逻辑
        echo "订单支付成功\n";

        // 通知所有观察者
        foreach ($this->observers as $observer) {
            $observer->update('pay_success');
        }
    }
}

class SendSmsObserver implements Observer
{
    public function update($event)
    {
        if ($event == 'pay_success') {
            echo "发送支付成功短信\n";
        }
    }
}

class SendEmailObserver implements Observer
{
    public function update($event)
    {
        if ($event == 'pay_success') {
            echo "发送支付成功邮件\n";
        }
    }
}

// 使用
$order = new Order();
$order->addObserver(new SendSmsObserver());
$order->addObserver(new SendEmailObserver());
$order->pay();

适用场景: 事件系统、消息通知。

4. 策略模式

定义一系列算法,让它们可以互相替换。

interface PayStrategy
{
    public function pay($amount);
}

class AlipayStrategy implements PayStrategy
{
    public function pay($amount)
    {
        echo "支付宝支付 {$amount} 元\n";
    }
}

class WechatPayStrategy implements PayStrategy
{
    public function pay($amount)
    {
        echo "微信支付 {$amount} 元\n";
    }
}

class OrderPay
{
    private $strategy;

    public function setStrategy(PayStrategy $strategy)
    {
        $this->strategy = $strategy;
    }

    public function pay($amount)
    {
        $this->strategy->pay($amount);
    }
}

// 使用
$orderPay = new OrderPay();
$orderPay->setStrategy(new AlipayStrategy());
$orderPay->pay(100);

总结

常用设计模式就这几个:

设计模式不是为了用而用,是解决特定问题的。项目小就别硬套,过度设计比没有设计更糟。

标签: PHP 设计模式 单例 工厂 观察者