迭代器有時又稱游標(cursor)是程式設計的軟體設計模式,可在容器物件(container,例如list或vector)上遍訪的介面,設計人員無需關心容器物件的內容。
各種語言實作iterator的方式皆不盡同,有些物件導向語言像j**a, c#, python, delphi都已將iterator的特性內建語言當中,完美的跟語言整合,我們稱之隱式迭代器(implicit iterator),但像是c++語言本身就沒有iterator的特色,但stl仍利用template實作了功能強大的iterator。
php5開始支援了介面, 並且內建了iterator介面, 所以如果你定義了乙個www.cppcns.com類,並實現了iterator介面,那麼你的這個類物件就是zend_iter_object,否則就是zend_iter_plain_object.
對於zend_iter_plain_object的類,foreach會通過hash_of獲取該物件的預設屬性陣列,然後對該陣列進行foreach.
先來看下迭代器的定義,那就是提供一種方法順序訪問乙個聚合物件中各個元素,而又不暴露該物件的內部顯示。它可幫助構造特定的物件,那些物件能夠提供單一標準介面迴圈或迭代任何型別程式設計客棧的可計數資料。來看下迭代器模式的結構圖:
再來看下迭代器需要用到的內部方法:
而對於zend_iter_object的類物件,則會通過呼叫物件實現的iterator介面相關函式來進行foreach。
<?php /**
* iterator模式的簡單實現類
*/class sample implements iterator
public function current()
public function next()
public function key()
public function rewind()
public function valid()
}/** demo */
$data = array(1, 2, 3, 4, 5);
$sa = new sample($data);
foreach ($sa as $key => $row)
?>
舉幾個迭代器的使用範圍:
使用返回迭代器的包或庫時(如php5中的spl迭代器)
無法在一次的呼叫獲取容器的所有元素時
要處理數量巨大的無素時(資料庫中的表以gb計的資料)
……不同的迭代器有不同的介面,例如php spl迭代器中包括next()(移動到下乙個元素),corrent()(返回當前元素),valid()(檢查迭代結尾),rewind()(從頭重新開始),key()(返回當前元素的索引)。當然你可以自己寫適合自己用的迭代器,也可以用系統中的迭代器。
一般是使用foreach來使用迭代器,下面整理了一下**:
<?php class sample implements iterator
public function rewind()
public function current()
public function key()
public function next()
public function valid()
}$sa = new sample();
foreach($sa as $key => $val)
?>
while迴圈也可以:
<?php while ($itertor->valid())
?>
為什麼要學習php的迭代器呢?有個很重要的原因:利用php的迭代器可以利用物件導向實現常見的資料結構,例如列表,堆疊,佇列與圖。後面會做乙個專題,用php實現大部分的資料結構,而且以物件導向的形式。所以這裡先預熱了一下php的迭代器。
總結
PHP 設計模式之迭代器模式
在不需要了解內部實現的前提條件下,可以遍歷乙個聚合物件的內部元素 相比於傳統的程式設計模式,迭代器模式可以隱藏遍歷元素所需的操作 class alluser implements iterator public function current public function next 第乙個呼叫 ...
PHP設計模式 迭代器模式
web開發筆記 www.chhua.com 每日練習 php設計模式 迭代器模式 呵呵,迭代器模式是php開發中非常有用的乙個設計模式,其主要的應用範圍如下 一 使用返回迭代器的包或庫時 如php5中的spl迭代器 二 無法在一次的呼叫獲取容器的所有元素時 三 要處理數量巨大的無素時 資料庫中的表以...
php設計模式(迭代器模式)
1.迭代器模式,在不需要了解內部實現的前提下,遍歷乙個聚合物件的內部元素 2.相比於傳統的程式設計模式,迭代器模式可以隱藏遍歷元素的所需的操作 迭代器需要實現系統內建的介面,並且實現介面的五個方法 class alluser implements iterator 獲取下乙個元素 public fu...