PHP设计模式
2021-01-29 21:14
标签:实例变量 iterator 获取当前值 uri private 移动 比较 实现 val 单例模式(Singleton) 工厂模式 注册模式 适配器模式 观察者模式 依赖注入模式 依赖注入DI、控制反转IOC、反射 控制反转IOC是一种思想,依赖注入DI是实施这种思想的方法 面向接口编程 使用时实例化并建立连接 构造器注入、setter、接口注入 容器模式 迭代器iterator 迭代器实际是一个实现了Iterator的类,可以用foreach进行遍历。 可以看到foreach 是先调用valid判断迭代器是否有效,然后再调用current获取当前值,同时调用next移动key到指向下一个值(输出key是因为 $k=>$v的缘故)。 生成器 生成器提供了一种更容易的方法来实现简单的对象迭代,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低。 PHP设计模式 标签:实例变量 iterator 获取当前值 uri private 移动 比较 实现 val 原文地址:https://www.cnblogs.com/zhoutianyuan/p/11040468.html/***
* 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;
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 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组, 那会使你的内存达到上限,或者会占据可观的处理时间。
相反,你可以写一个生成器函数,就像一个普通的自定义函数一样, 和普通函数只返回一次不同的是, 生成器可以根据需要 yield 多次,以便生成需要迭代的值。
PHP 将会在每次需要值的时候调用生成器函数,并在产生一个值之后保存生成器的状态,这样它就可以在需要产生下一个值的时候恢复调用状态。 1 php
2 function gen_one_to_three() {
3 for ($i = 1; $i $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对象