国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

PHP設計模式漫談之迭代器模式

2020-03-22 17:59:23
字體:
來源:轉載
供稿:網友
  • 原文出處:blogspot

    今天《PHP設計模式漫談》系列的主角是迭代器(Iterator)模式,它在一個很常見的過程上提供了一個抽象:位于對象圖不明部分的一組對象(或標量)集合上的迭代。迭代有幾種不同的具體執行方法:在數組屬性,集合對象,數組,甚至一個查詢結果集之上迭代。

    在對象的世界里,迭代器模式要維持類似數組的功能,看作是一個非侵入性對象刻面(facet),Client類往往分離自真實對象實現,指iterator接口。只要有可能,我們可以給迭代器傳送一個引用,代替將來可能發生變化的具體或抽象類。

    圖1 迭代器模式

    參與者:

    客戶端(Client):引用迭代器模式的方法在一組值或對象上執行一個循環。

    ◆迭代器(Iterator):在迭代過程上的抽象,包括next(),isFinished(),html' target='_blank'>current()等方法。

    ◆具體迭代器(ConcreteIterators):在一個特定的對象集,如數組,樹,組合,集合等上實現迭代。

    通過Traversable接口,PHP原生態支持迭代器模式,這個接口由Iterator和IteratorAggregate做了擴展,這兩個子接口不僅是定義了一套標準的方法,每個Traversable對象都可以原封不動地傳遞給foreach(),foreach是迭代器的主穴ky"http://www.it165.net/qq/" target="_blank" class="keylink">qq/zbuntsujrEl0ZXJhdG9yyrXP1srH1ebV/bXEtfy0+sb3o6y2+El0ZXJhdG9yQWdncmVnYXRlysfT0Mbky/zWsNTwtcRUcmF2ZXJzYWJsZbbUz/OjrMv8zai5/WdldEl0ZXJhdG9yKCm3vbeot7W72NK7uPZJdGVyYXRvcqGjPC9wPgo8aW1nIHNyYz0="http://www.it165.net/uploadfile/files/2015/0722/20150722191927643.png" alt="">

     

    標準PHP庫是PHP中綁定的唯一通用目的面向對象庫,定義了額外的接口和公用類。OuterIterator實現裝飾一個Iterator,CachingIterator和LimitIterator是這個接口的兩個例子。

    RecursiveIterator是Iterator接口為樹形結構實現的一個擴展,它定義了一組額外的方法檢查迭代中當前元素的子對象是否存在。RecursiveArrayIterator和RecursiveDirectoryIterator是這個接口的實現示例,這些類型的迭代器可以原樣使用,或是用一個RecursiveIteratorIterator橋接到一個普通的迭代器契約。這個OuterIterator實現將會根據構造參數執行深度優先或廣度優先遍歷。

    使用RecursiveIteratorIterator時,可以將其傳遞給foreach,請看后面的代碼示例,了解RecursiveIterators的不同用法和它們的超集Iterator。最后,SeekableIterators向契約添加了一個seek()方法,它可以用于移動Iterator的內部狀態到一個特定的迭代點。

    注意,迭代器是比對象集更好的抽象,因為我們可以讓InfiniteIterators,NoRewindIterators等,不用與普通數組陣列與一致,因此,Iterator缺少count()函數等功能。

    在PHP官方手冊中可以找到完整的SPL迭代器列表。得益于對PHP的強力支持,使用迭代器模式的大部分工作都包括在標準實現中,下面的代碼示例就利用了標準Iterator和RecursiveIterators的功能。

    <?php /**  * Collection that wraps a numeric array.  * All five public methods are needed to implement  * the Iterator interface.  */class Collection implements Iterator {  private $_content;  private $_index = 0;   public function __construct(array $content)  {  $this->_content = $content;  }   public function rewind()  {  $this->_index = 0;  }   public function valid()  {  return isset($this->_content[$this->_index]);  }   public function current()  {  return $this->_content[$this->_index];  }   public function key()  {  return $this->_index;  }   public function next()  {  $this->_index++;  } }  $arrayarray = array('A', 'B', 'C', 'D'); echo "Collection: "; foreach (new Collection($array) as $key => $value) {  echo "$key => $value. "; } echo "";

    /**  * Usually IteratorAggregate is the interface to implement.  * It has only one method, which must return an Iterator  * already defined as another class (e.g. ArrayIterator)  * Iterator gives a finer control over the algorithm,  * because all the hook points of Iterator' contract  * are available for implementation.  */class NumbersSet implements IteratorAggregate {  private $_content;   public function __construct(array $content)  {  $this->_content = $content;  }   public function contains($number)  {  return in_array($number, $this->_content);  }   /**  * Only this method is necessary to implement IteratorAggregate.  * @return Iterator  */ public function getIterator()  {  return new ArrayIterator($this->_content);  } }  echo "NumbersSet: "; foreach (new NumbersSet($array) as $key => $value) {  echo "$key => $value. "; } echo "";

    // let's play with RecursiveIterator implementations $it = new RecursiveArrayIterator(array(  'A',  'B',  array(  'C',  'D' ),  array(  array(  'E',  'F' ),  array(  'G',  'H',  'I' )  ) )); // $it is a RecursiveIterator but also an Iterator, // so it loops normally over the four elements // of the array. echo "Foreach over a RecursiveIterator: "; foreach ($it as $value) {  echo $value;  // but RecursiveIterators specify additional  // methods to explore children nodes  $children = $it->hasChildren() ? '{Yes}' : '{No}';  echo $children, ' '; } echo ""; // we can bridge it to a different contract via // a RecursiveIteratorIterator, whose cryptic name // should be read as 'an Iterator that spans over // a RecursiveIterator'. echo "Foreach over a RecursiveIteratorIterator: "; foreach (new RecursiveIteratorIterator($it) as $value) {  echo $value; } echo "";


    PHP編程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 福贡县| 漾濞| 佛教| 合山市| 栾城县| 霍林郭勒市| 铜山县| 巴楚县| 南宁市| 巨野县| 乡城县| 北辰区| 诏安县| 米易县| 夏邑县| 金塔县| 什邡市| 昌都县| 渝中区| 阜康市| 罗山县| 鹤庆县| 新疆| 民丰县| 玛多县| 宁都县| 犍为县| 大英县| 河池市| 邹平县| 肇东市| 喀喇沁旗| 滨海县| 新余市| 北京市| 高邮市| 深圳市| 盐城市| 桑植县| 南开区| 阜新市|