PHP设计模式

单例模式(Singleton)

/***
 * Class Singleton 单例模式
 * 单例类不能再其它类中直接实例化,只能被其自身实例化。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
 * 1.私有的构造函数、克隆函数,防止外部代码new、clone
 * 2.私有的静态的成员变量来保存类的实例
 * 3.公共的静态函数来访问类的实例
 */
class Singleton {
    private static $instance = null;//声明一个私有的实例变量

    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    private function __construct() {
    }

    private function __clone() {
    }
}

$a = Singleton::getInstance();
$b = Singleton::getInstance();
/*判断两个类是否为同一个类*/
echo $a === $b ? 1 : 0; // 1
exit;

工厂模式

注册模式

适配器模式

观察者模式

依赖注入模式

 依赖注入DI、控制反转IOC、反射

控制反转IOC是一种思想,依赖注入DI是实施这种思想的方法

面向接口编程

使用时实例化并建立连接

构造器注入、setter、接口注入

容器模式

迭代器iterator

迭代器实际是一个实现了Iterator的类,可以用foreach进行遍历。

<?php
class Sample implements Iterator{
  private $curIndex=0;
  private $items=null;
  public function __construct($_items) {
    $this->items = $_items;
  }
  public function current (){
    echo "current\n";
    return $this->items[$this->curIndex];
  }
  public function key (){
    echo "key\n";
    return $this->curIndex;
  }
  public function next (){   
      echo "next\n"; 
      $this->curIndex++;
  }
  public function rewind (){
      $this->curIndex = 0;   
  }
  public function send ( $value ){
    if($value == "stop"){
      $this->curIndex = null;
    }
  }
  public function valid (){
    echo "valid\n";
    return isset($this->items[$this->curIndex]);
  }
}
$sample = new Sample([1,2,3]);
foreach ($sample as $k =>$v){
}>>>>> valid current key next

可以看到foreach 是先调用valid判断迭代器是否有效,然后再调用current获取当前值,同时调用next移动key到指向下一个值(输出key是因为 $k=>$v的缘故)。

 生成器

生成器提供了一种更容易的方法来实现简单的对象迭代,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低。
生成器允许你在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组, 那会使你的内存达到上限,或者会占据可观的处理时间。
相反,你可以写一个生成器函数,就像一个普通的自定义函数一样, 和普通函数只返回一次不同的是, 生成器可以根据需要 yield 多次,以便生成需要迭代的值。
PHP 将会在每次需要值的时候调用生成器函数,并在产生一个值之后保存生成器的状态,这样它就可以在需要产生下一个值的时候恢复调用状态。

<?php
function gen_one_to_three() {
  for ($i = 1; $i <= 3; $i++) {
    //注意变量$i的值在不同的yield之间是保持传递的。
    yield $i;
  }
}
$generator = gen_one_to_three();
foreach ($generator as $value) {
  echo "$value\n";
}
var_dump($generator); //实际上是Generator对象

相关推荐