PHP設計模式入門之迭代器模式原理與實現方法分析
阿新 • • 發佈:2020-04-27
本文例項講述了PHP設計模式入門之迭代器模式。分享給大家供大家參考,具體如下:
在深入研究這個設計模式之前,我們先來看一道面試題,來自鳥哥的部落格,
題目是這樣的:
使物件可以像陣列一樣進行foreach迴圈,要求屬性必須是私有。
不使用迭代器模式很難實現,先看實現的程式碼:
sample.php
<?php class Sample implements Iterator{ private $_arr; public function __construct(Array $arr){ $this->_arr = $arr; } public function current(){ return current($this->_arr); } public function next(){ return next($this->_arr); } public function key(){ return key($this->_arr); } public function valid(){ return $this->current() !== false; } public function rewind(){ reset($this->_arr); } }
index.php
<?php require 'Sample.php'; $arr = new Sample(['max','ben','will']); foreach ($arr as $k=>$v){ echo $k."-".$v."<br />"; }
其中Iterator介面來自php的spl類庫,在寫完設計模式的相關文章之後,將會進一步研究這個類庫。
另外在網上找到了一段yii框架中關於迭代器模式的實現程式碼:
class CMapIterator implements Iterator { /** * @var array the data to be iterated through */ private $_d; /** * @var array list of keys in the map */ private $_keys; /** * @var mixed current key */ private $_key; /** * Constructor. * @param array the data to be iterated through */ public function __construct(&$data) { $this->_d=&$data; $this->_keys=array_keys($data); } /** * Rewinds internal array pointer. * This method is required by the interface Iterator. */ public function rewind() { $this->_key=reset($this->_keys); } /** * Returns the key of the current array element. * This method is required by the interface Iterator. * @return mixed the key of the current array element */ public function key() { return $this->_key; } /** * Returns the current array element. * This method is required by the interface Iterator. * @return mixed the current array element */ public function current() { return $this->_d[$this->_key]; } /** * Moves the internal pointer to the next array element. * This method is required by the interface Iterator. */ public function next() { $this->_key=next($this->_keys); } /** * Returns whether there is an element at current position. * This method is required by the interface Iterator. * @return boolean */ public function valid() { return $this->_key!==false; } } $data = array('s1' => 11,'s2' => 22,'s3' => 33); $it = new CMapIterator($data); foreach ($it as $row) { echo $row,'<br />'; }
關於迭代器設計模式官方的定義是:使用迭代器模式來提供對聚合物件的統一存取,即提供一個外部的迭代器來對聚合物件進行訪問和遍歷,而又不需暴露該物件的內部結構。又叫做遊標(Cursor)模式。
好吧,我不是很能理解。為什麼明明陣列已經可以用foreach來遍歷了還要用這樣一種迭代器模式來實現,只有等待工作經驗的加深來進一步理解吧。
參考文件:
https://www.jb51.net/article/184182.htm
https://www.jb51.net/article/185478.htm
https://www.jb51.net/article/185483.htm
更多關於PHP相關內容感興趣的讀者可檢視本站專題:《php面向物件程式設計入門教程》、《PHP陣列(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算子用法總結》、《php字串(string)用法總結》、《php+mysql資料庫操作入門教程》及《php常見資料庫操作技巧彙總》
希望本文所述對大家PHP程式設計有所幫助。