PHP设计模式从入门到精通:完整示例指南

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

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

开始课程

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

博客

书籍推荐