php专区

 首页 > php专区 > PHP应用 > 常用功能 > PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】

PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】

分享到:
【字体:
导读:
         [导读] PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】...

本文实例讲述了PHP中常用的三种设计模式。分享给大家供大家参考,具体如下:1.单例模式

  • 在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。private。单例类的加强:禁止克隆。
    bark();
    // 下面将得到Example类的单例对象
    $test = Example::singleton();
    $test->bark();
    // 复制对象将导致一个E_USER_ERROR.
    $test_clone = clone $test;
    ?>
    
    PHP对象克隆__clone()介绍2. 工厂模式
    
    width = $width;
        $this->height = $height;
      }
      public function getCircum() {
        return 2 * ($this->width + $this->height);
      }
      public function getArea() {
        return $this->width * $this->height;
      }
    }
    // 定义圆类
    class Circle implements IShape {
      private $radii;
      public function __construct($radii) {
        $this->radii = $radii;
      }
      public function getCircum() {
        return 2 * M_PI * $this->radii;
      }
      public function getArea() {
        return M_PI * pow($this->radii, 2);
      }
    }
    // 根据传入的参数个数不同来创建不同的形状。
    class FactoryShape {
      public static function create() {
        switch (func_num_args()) {
          case 1:
          return new Circle(func_get_arg(0));
          break;
          case 2:
          return new Rectangle(func_get_arg(0), func_get_arg(1));
          break;
        }
      }
    }
    // 矩形对象
    $c = FactoryShape::create(4, 2);
    var_dump($c->getArea());
    // 圆对象
    $o = FactoryShape::create(2);
    var_dump($o->getArea());
    
    
    

    3. 观察者模式

    name;
      }
    }
    // 可被观察类
    class Observable implements IObservable {
      protected $observers = array();
      public function addObserver($observer) {
        if (!($observer instanceof IObserver)) {
          return;
        }
        $this->observers[] = $observer;
      }
      public function removeObserver($observer_name) {
        foreach ($this->observers as $index => $observer) {
          if ($observer->getName() === $observer_name) {
            array_splice($this->observers, $index, 1);
            return;
          }
        }
      }
    }
    // 模拟一个可以被观察的类:RadioStation
    class RadioStation extends Observable {
      public function addListener($listener) {
        foreach ($this->observers as $observer) {
          $observer->onListen($this, $listener);
        }
      }
    }
    // 模拟一个观察者类
    class RadioStationLogger extends Observer {
      protected $name = 'logger';
      public function onListen($sender, $args) {
        echo $args, ' join the radiostation.
    '; } } // 模拟另外一个观察者类 class OtherObserver extends Observer { protected $name = 'other'; public function onListen($sender, $args) { echo 'other observer..
    '; } } $rs = new RadioStation(); // 注入观察者 $rs->addObserver(new RadioStationLogger()); $rs->addObserver(new OtherObserver()); // 移除观察者 $rs->removeObserver('other'); // 可以看到观察到的信息 $rs->addListener('cctv'); ?> php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

    希望本文所述对大家PHP程序设计有所帮助。

  • 分享到:
    PHP如何实现阿里云短信sdk灵活应用在项目...
    首先安装 composer require alibabacloud/sdkhttps://packagist.org/packages/alibabacloud/sdk
    PHP面向对象程序设计子类扩展父类(子类...
    本文实例讲述了PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作。分享给大家供大家参考,具体如下:父类类名::方法” 或“parent::方法重新载入父类,然后再加上需要扩展的语句。方法的重写 重写方法与访问权限protected,那么在子类中重写的方法的权限就要是protected或public。如果父类的方法是...
    •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
    • 在这里……