PHP设计模式:从基础到高级技术
设计模式(design patterns)是经过反复验证的、针对软件开发中常见问题的解决方案。对于PHP开发者而言,掌握设计模式不仅是简历上的一个亮点,更是创建灵活、可维护、可扩展代码的实际工具。本文将结合PHP具体示例,详细讲解GoF(四人帮)三大类设计模式,您可以直接将这些模式应用到自己的项目中。
1. 创建型模式(Creational Patterns)
这些模式负责对象的创建,隐藏实例化逻辑,使系统独立于对象的创建和组合方式。
单例模式(Singleton)
确保一个类只有一个实例,并提供一个全局访问点。经典示例是数据库连接。
<?phpclass Database { private static ?Database $instance = null; private PDO $pdo;
private function __construct() { $this->pdo = new PDO('mysql:host=localhost;dbname=test', 'root', ''); }
public static function getInstance(): Database { if (self::$instance === null) { self::$instance = new self(); } return self::$instance; }
public function query(string $sql): array { // 执行查询逻辑 return $this->pdo->query($sql)->fetchAll(); }
// 禁止克隆和反序列化 private function __clone() {} public function __wakeup() { throw new Exception("Cannot unserialize singleton"); }}
// 使用$db = Database::getInstance();$results = $db->query("SELECT * FROM users");?>工厂方法模式(Factory Method)
定义一个创建对象的接口,但让子类决定实例化哪个类。非常适合创建相关对象家族。
<?phpinterface Logger { public function log(string $message): void;}
class FileLogger implements Logger { public function log(string $message): void { file_put_contents('app.log', $message . PHP_EOL, FILE_APPEND); }}
class DatabaseLogger implements Logger { public function log(string $message): void { // 保存到数据库 echo "Logged to DB: $message"; }}
abstract class LoggerFactory { abstract public function createLogger(): Logger;
public function logMessage(string $message): void { $logger = $this->createLogger(); $logger->log($message); }}
class FileLoggerFactory extends LoggerFactory { public function createLogger(): Logger { return new FileLogger(); }}
class DatabaseLoggerFactory extends LoggerFactory { public function createLogger(): Logger { return new DatabaseLogger(); }}
// 使用$factory = new FileLoggerFactory();$factory->logMessage("这条消息将被写入文件");?>2. 结构型模式(Structural Patterns)
这些模式定义如何将类和对象组合成更大的结构,同时保持灵活性和效率。
适配器模式(Adapter)
允许接口不兼容的对象协同工作。适配器充当包装器,将一个接口的调用转换为另一个接口。
<?php// 旧类,接口不友好class OldPaymentSystem { public function processPayment(float $amount, string $currency): string { return "Processing $amount $currency via legacy system"; }}
// 我们希望使用的新接口interface NewPaymentInterface { public function pay(float $amount): string;}
// 适配器class PaymentAdapter implements NewPayme