PHP设计模式
Posted zhoutianyuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 "; 10 return $this->items[$this->curIndex]; 11 } 12 public function key (){ 13 echo "key "; 14 return $this->curIndex; 15 } 16 public function next (){ 17 echo "next "; 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 "; 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 "; 11 } 12 var_dump($generator); //实际上是Generator对象
以上是关于PHP设计模式的主要内容,如果未能解决你的问题,请参考以下文章