最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • PHP 设计模式实战详解

    设计模式为软件设计提供经过验证的解决方案,解决常见编程问题。本文深入探讨 php 中的常用设计模式,并通过实战案例进行阐述,涵盖单例模式、工厂方法模式和观察者模式。

    PHP 设计模式实战详解

    PHP 设计模式实战详解

    设计模式为软件设计提供了一套经过验证的解决方案,以解决常见编程问题。本文将深入探讨 PHP 中常用的设计模式,并通过实战案例进行阐述。

    单例模式

    单例模式确保某个类仅被实例化一次。这对于全局资源或配置管理器很有用。

    class Database {
      private static ?PDO $instance = null;
    
      private function __construct() {}
    
      public static function getInstance(): PDO {
        if (self::$instance === null) {
          self::$instance = new PDO('<a style='color:#f60; text-decoration:underline;' href="https://www.codesou.cn/" target="_blank">mysql</a>:host=localhost;dbname=my_db', 'user', 'password');
        }
    
        return self::$instance;
      }
    }
    
    // 使用 Singleton
    $db1 = Database::getInstance();
    $db2 = Database::getInstance();
    
    // 两个变量指向同一个 PDO 对象
    var_dump($db1 === $db2); // true

    工厂方法模式

    工厂方法模式定义一个创建对象的接口,但允许子类更改创建过程。这提供了一种分离创建逻辑和产品类的灵活方式。

    interface Shape {
      public function draw(): void;
    }
    
    class Circle implements Shape {
      public function draw(): void {
        echo 'Drawing a circle.' . PHP_EOL;
      }
    }
    
    class Square implements Shape {
      public function draw(): void {
        echo 'Drawing a square.' . PHP_EOL;
      }
    }
    
    class ShapeFactory {
      public static function createShape(string $type): Shape {
        switch ($type) {
          case 'circle':
            return new Circle();
          case 'square':
            return new Square();
          default:
            throw new InvalidArgumentException('Invalid shape type.');
        }
      }
    }
    
    // 使用工厂方法
    $circle = ShapeFactory::createShape('circle');
    $square = ShapeFactory::createShape('square');
    
    $circle->draw(); // Drawing a circle.
    $square->draw(); // Drawing a square.

    观察者模式

    观察者模式定义了一个一对多的依赖关系,其中一个对象(主题)可以通知多个对象(观察者)状态变化。

    interface Subject {
      public function attach(Observer $observer): void;
      public function detach(Observer $observer): void;
      public function notify(): void;
    }
    
    class NewsPortal implements Subject {
      private array $observers = [];
      private string $latestNews;
    
      public function attach(Observer $observer): void {
        $this->observers[] = $observer;
      }
    
      public function detach(Observer $observer): void {
        unset($this->observers[array_search($observer, $this->observers)]);
      }
    
      public function notify(): void {
        foreach ($this->observers as $observer) {
          $observer->update($this);
        }
      }
    
      public function publishNews(string $news): void {
        $this->latestNews = $news;
        $this->notify();
      }
    }
    
    interface Observer {
      public function update(Subject $subject): void;
    }
    
    class NewsReader implements Observer {
      public function update(Subject $subject): void {
        $news = $subject->getLatestNews();
        echo 'Received latest news: ' . $news . PHP_EOL;
      }
    }
    
    // 使用观察者模式
    $newsPortal = new NewsPortal();
    $reader1 = new NewsReader();
    $reader2 = new NewsReader();
    
    $newsPortal->attach($reader1);
    $newsPortal->attach($reader2);
    
    $newsPortal->publishNews('New developments in the ongoing war.');
    $newsPortal->detach($reader2);
    $newsPortal->publishNews('Another major breakthrough in science.');
    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » PHP 设计模式实战详解
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 293稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情