PHP 常用设计模式
PHP 常用设计模式
设计模式是写好代码的经验总结,常用的几种要掌握。
1. 单例模式
整个项目只有一个实例,比如数据库连接。
class Db
{
private static $instance = null;
private function __construct() {}
public static function getInstance()
{
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
}
$db = Db::getInstance();
2. 工厂模式
根据参数创建不同的对象。
class Factory
{
public static function make($type)
{
$class = ucfirst($type);
return new $class();
}
}
$user = Factory::make('user');
$order = Factory::make('order');
3. 观察者模式
一个对象状态变化,通知所有观察者。
interface Observer
{
public function update($event);
}
class Event
{
private $observers = [];
public function add(Observer $observer)
{
$this->observers[] = $observer;
}
public function trigger($event)
{
foreach ($this->observers as $ob) {
$ob->update($event);
}
}
}
4. 常用场景
- 单例: 数据库、日志、配置
- 工厂: 创建不同类的对象
- 观察者: 事件触发、消息通知
- 策略: 不同支付方式
- 适配器: 兼容不同接口
5. 设计原则
- 单一职责:一个类只做一件事
- 开闭原则:对扩展开放,对修改关闭
- 依赖倒置:依赖抽象不依赖具体
总结
PHP 常用设计模式要点:
- 单例模式:只创建一个实例
- 工厂模式:统一创建对象
- 观察者:事件通知
- 理解设计原则
- 不要为了模式而模式
设计模式是工具,解决问题才是目的。
PHP 常用设计模式
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);
总结
常用设计模式就这几个:
- 单例模式: 全局唯一对象(数据库连接)
- 工厂模式: 统一创建对象
- 观察者模式: 事件通知
- 策略模式: 算法切换
设计模式不是为了用而用,是解决特定问题的。项目小就别硬套,过度设计比没有设计更糟。