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

首頁 > 編程 > PHP > 正文

對php中IteratorIterator的理解(代碼示例)

2020-03-22 19:33:08
字體:
供稿:網(wǎng)友

本篇文章給大家?guī)淼膬?nèi)容是關(guān)于php中IteratorIterator的理解(代碼示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

 

 

php之IteratorIterator個人理解

最近有重新開始搗鼓laravel的源碼了,一年多沒用實在是忘的差不多了,每次看都會從中學到很多,不懂就趕緊查手冊。看到加載配置文件的部分(config/*.php),代碼中大量使用spl類庫和接口,今天就來扯一下IteratorIterator類,網(wǎng)上資料太少了,加上本人也不是怎么聰明,搞了好幾天才有點眉目,以下是對它的個人理解。

IteratorIterator簡介

IteratorIterator是一個迭代器包裝器,當然它本身也是迭代器。它(假定它叫Outer)在實例化時必須傳入一個實現(xiàn)了Traversable接口類型的迭代器實例(假定它叫Inner),當然你可以通過Outer的getInnerIterator方法獲取到這個傳入的迭代器參數(shù)Inner。你可以通過Outer的rewind(),next(),valid(),html' target='_blank'>current()和key()方法對內(nèi)部迭代器Inner進行處理。

重點理解

在遍歷Outer的過程中,Outer只是將rewind(),next(),valid(),current()和key()的任何調(diào)用轉(zhuǎn)發(fā)給內(nèi)部迭代器Inner。

Outer可以對轉(zhuǎn)發(fā)返回的結(jié)果進行包裝,但這并不會對Inner產(chǎn)生任何影響。

代碼演示
 ?phpnamespace young;class InnerIterator implements Iterator{ private $dates; private $position; public function __construct($dates = []) $this- dates = $dates; $this- position = 0; public function rewind() echo call . __METHOD__ . br  reset($this- dates); public function valid()  echo call . __METHOD__ . br  if ($this- position = count($this- dates)) { # code... return false; return true; public function current() echo call . __METHOD__ . br  return $this- dates[$this- position]; public function key() echo call . __METHOD__ . br  return $this- position; public function next() echo call . __METHOD__ . br  ++$this- position; }}class OuterIterator extends IteratorIterator{ function rewind() echo __METHOD__ . br  return parent::rewind(); function valid() echo __METHOD__ . br  return parent::valid(); function current() echo __METHOD__ . br  return parent::current() . _suffix  function key() echo __METHOD__ . br  return parent::key() ; function next() echo __METHOD__ . br  return parent::next() ; function getInnerIterator()  echo __METHOD__ . br  return parent::getInnerIterator(); }}$tmpArr = array( 2018-10-01 , 2018-10-02 , // 2018-10-03 $inner = new InnerIterator($tmpArr);$outer = new OuterIterator($inner);foreach ($outer as $key = $value) { # code... echo $key , = , $value . hr }
運行結(jié)果:
youngOuterIterator::rewind
call youngInnerIterator::rewindcall youngInnerIterator::validcall youngInnerIterator::currentcall youngInnerIterator::key
youngOuterIterator::validyoungOuterIterator::currentyoungOuterIterator::key0= 2018-10-01_suffixyoungOuterIterator::next
call youngInnerIterator::nextcall youngInnerIterator::validcall youngInnerIterator::currentcall youngInnerIterator::key
youngOuterIterator::validyoungOuterIterator::currentyoungOuterIterator::key1= 2018-10-02_suffixyoungOuterIterator::next
call youngInnerIterator::nextcall youngInnerIterator::valid
 youngOuterIterator::valid object(youngInnerIterator)#1 (2) { [“dates”:“youngInnerIterator”:private]= array(2) { [0]= string(10) “2018-10-01” [1]= string(10) “2018-10-02” } [“position”:“youngInnerIterator”:private]= int(2) }
結(jié)果分析

Outer的每次迭代會先調(diào)用自己的方法,然后轉(zhuǎn)發(fā)給Inner。
Outer內(nèi)部方法的返回值都是基于Inner的相對于方法的返回。
你可以在Outer內(nèi)方法對Inner的返回值做邏輯處理。
當Inner的valid返回false的時候,外層的Outer也將停止迭代。
Outer內(nèi)的方法對返回值的修改并不會影響Inner。
Outer內(nèi)的方法在迭代過程中并不會執(zhí)行g(shù)etInnerIterator方法,它只是一個獲取Inner方法的調(diào)用接口。

一點補充

之前在網(wǎng)上翻閱資料時會看到這樣的疑惑

//假如這里還是使用了上面的兩個類代碼 ?phpnamespace young;class InnerIterator implements Iterator //code 這里的代碼假如和上面的一樣class OuterIterator extends IteratorIterator //code 這里的代碼假如和上面的一樣$outer- valid(); //false$outer- current(); // _suffix 問題一$outer- rewind(); $outer- valid(); //true$outer- current(); //2018-10-01_suffix$outer- next()$outer- rewind();$outer- current(); //2018-10-02_suffix 問題二

這里有兩個問題,

問題一,為什么當前current沒值,valid為false

問題二,問什么next后rewind之后,current是第二個值

從上面的運行結(jié)果可知,$outer不執(zhí)行rewind,$inner也不會執(zhí)行,所以valid返回false,current為null,_suffix只是自己拼接上的。
第二個問題也是很奇怪的,也是剛剛發(fā)現(xiàn)的,$inner的指針只要前進了,就回不去了,也就是說 $inner的position屬性在第一次next之后變成1了,即使你rewind,position還是1,這個有點蒙蔽啊。。。
所以如果你進行了$outer的遍歷操作,第二遍是沒值輸出的,即使第二遍也執(zhí)行了rewind操作,但是這個操作在第二遍壓根就沒用~~~

以上就是對php中IteratorIterator的理解(代碼示例)的詳細內(nèi)容,PHP教程

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 元朗区| 巫溪县| 景德镇市| 巴塘县| 田阳县| 保山市| 乌鲁木齐县| 江阴市| 温州市| 宕昌县| 禹州市| 桐柏县| 图片| 尉犁县| 新民市| 娱乐| 德州市| 芜湖市| 澄城县| 酒泉市| 台中市| 楚雄市| 清新县| 龙游县| 龙井市| 秦安县| 高州市| 庄河市| 烟台市| 龙里县| 扎鲁特旗| 柯坪县| 平度市| 盐边县| 灵山县| 沙湾县| 四子王旗| 广汉市| 神木县| 襄城县| 娱乐|