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进行遍历。

 1 <?php
 2 class Sample implements Iterator{
 3   private $curIndex=0;
 4   private $items=null;
 5   public function __construct($_items) {
 6     $this->items = $_items;
 7   }
 8   public function current (){
 9     echo "current\n";
10     return $this->items[$this->curIndex];
11   }
12   public function key (){
13     echo "key\n";
14     return $this->curIndex;
15   }
16   public function next (){   
17       echo "next\n"; 
18       $this->curIndex++;
19   }
20   public function rewind (){
21       $this->curIndex = 0;   
22   }
23   public function send ( $value ){
24     if($value == "stop"){
25       $this->curIndex = null;
26     }
27   }
28   public function valid (){
29     echo "valid\n";
30     return isset($this->items[$this->curIndex]);
31   }
32 }
33 $sample = new Sample([1,2,3]);
34 foreach ($sample as $k =>$v){
35 }
>>>>> valid current key next

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

 生成器

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

 

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

 

posted @ 2020-06-27 18:17  zhoutianyuan  阅读(202)  评论(0编辑  收藏  举报