單例模式(Singleton) /*** * Class Singleton 單例模式 * 單例類不能再其它類中直接實例化,只能被其自身實例化。它不會創建實例副本,而是會向單例類內部存儲的實例返回一個引用。 * 1.私有的構造函數、克隆函數,防止外部代碼new、clone * 2.私有的靜態的成員變 ...
單例模式(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對象