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);
总结
常用设计模式就这几个:
- 单例模式: 全局唯一对象(数据库连接)
- 工厂模式: 统一创建对象
- 观察者模式: 事件通知
- 策略模式: 算法切换
设计模式不是为了用而用,是解决特定问题的。项目小就别硬套,过度设计比没有设计更糟。