激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - PHP設計模式之迭代器模式的深入解析

PHP設計模式之迭代器模式的深入解析

2020-04-13 12:34PHP教程網 PHP教程

本篇文章是對PHP設計模式中的迭代器模式進行了詳細的分析介紹,需要的朋友參考下

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

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


PHP設計模式之迭代器模式的深入解析

 

參與者:
◆客戶端(Client):
引用迭代器模式的方法在一組值或對象上執行一個循環。
◆迭代器(Iterator):在迭代過程上的抽象,包括next(),isFinished(),current()等方法。
◆具體迭代器(ConcreteIterators):在一個特定的對象集,如數組,樹,組合,集合等上實現迭代。
通過Traversable接口,PHP原生態支持迭代器模式,這個接口由Iterator和IteratorAggregate做了擴展,這兩個子接口不僅是定義了一套標準的方法,每個Traversable對象都可以原封不動地傳遞給foreach(),foreach是迭代器的主要客戶端,Iterator實現是真正的迭代器,而IteratorAggregate是有其它職責的Traversable對象,它通過getIterator()方法返回一個Iterator。

PHP設計模式之迭代器模式的深入解析

標準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++; 
 } 
    } 

    $array = array('A', 'B', 'C', 'D'); 
    echo "Collection: "; 
    foreach (new Collection($array) as $key => $value) { 
 echo "$key => $value. "; 
    } 
    echo "\n";
    /** 
     * 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 "\n";
    // 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 "\n"; 
    // 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 "\n";

 

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 精品国产看高清国产毛片 | 欧美在线a | av之家在线观看 | 鲁丝片一区二区三区免费入口 | 国产免费成人 | 一级毛片免费大片 | av免费片 | 国产一区二区三区在线免费 | 一区二区三区日韩 | 日本在线观看视频网站 | 91久久夜色精品国产网站 | 好吊色欧美一区二区三区四区 | 午夜视频中文字幕 | 欧美人与性禽动交精品 | 毛片在线免费观看完整版 | asiass极品裸体女pics | 久久精品视频日本 | 中文字幕四区 | av电影网在线观看 | 久久国产精品久久久久久 | 久久激情小视频 | 国产羞羞视频在线观看 | 精品99在线视频 | 草莓福利视频在线观看 | 日韩精品a在线观看 | 欧美精品欧美极品欧美激情 | 日韩在线视频免费观看 | 欧美日韩在线看片 | 国产91亚洲精品一区二区三区 | 一级黄色免费观看 | 麻豆国产一区 | 在线观看91精品 | 未成年人在线观看 | 99ri在线| 欧美在线观看视频网站 | 久久久久久久久久久影视 | 国产精品亚洲激情 | 黄污在线观看 | 久久久久久久一区二区三区 | 欧美精品一区二区三区在线 | 久草在线资源福利站 |