|
導(dǎo)讀網(wǎng)頁(yè)的本質(zhì)就是超級(jí)文本標(biāo)記語(yǔ)言,通過(guò)結(jié)合使用其他的Web技術(shù)(如:腳本語(yǔ)言、公共網(wǎng)關(guān)接口、組件等),可以創(chuàng)造出功能強(qiáng)大的網(wǎng)頁(yè)。因而,超級(jí)文本標(biāo)記語(yǔ)言是萬(wàn)維網(wǎng)(Web)編程的基礎(chǔ),也就是說(shuō)萬(wàn)維網(wǎng)是建立... 網(wǎng)頁(yè)的本質(zhì)就是超級(jí)文本標(biāo)記語(yǔ)言,通過(guò)結(jié)合使用其他的Web技術(shù)(如:腳本語(yǔ)言、公共網(wǎng)關(guān)接口、組件等),可以創(chuàng)造出功能強(qiáng)大的網(wǎng)頁(yè)。因而,超級(jí)文本標(biāo)記語(yǔ)言是萬(wàn)維網(wǎng)(Web)編程的基礎(chǔ),也就是說(shuō)萬(wàn)維網(wǎng)是建立在超文本基礎(chǔ)之上的。超級(jí)文本標(biāo)記語(yǔ)言之所以稱為超文本標(biāo)記語(yǔ)言,是因?yàn)槲谋局邪怂^“超級(jí)鏈接”點(diǎn)。 本篇文章給大家?guī)?lái)的內(nèi)容是關(guān)于php中IteratorIterator的理解(代碼示例),有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。
php之IteratorIterator個(gè)人理解最近有重新開始搗鼓laravel的源碼了,一年多沒(méi)用實(shí)在是忘的差不多了,每次看都會(huì)從中學(xué)到很多,不懂就趕緊查手冊(cè)。看到加載配置文件的部分(config/*.php),代碼中大量使用spl類庫(kù)和接口,今天就來(lái)扯一下IteratorIterator類,網(wǎng)上資料太少了,加上本人也不是怎么聰明,搞了好幾天才有點(diǎn)眉目,以下是對(duì)它的個(gè)人理解。 IteratorIterator簡(jiǎn)介IteratorIterator是一個(gè)迭代器包裝器,當(dāng)然它本身也是迭代器。它(假定它叫Outer)在實(shí)例化時(shí)必須傳入一個(gè)實(shí)現(xiàn)了Traversable接口類型的迭代器實(shí)例(假定它叫Inner),當(dāng)然你可以通過(guò)Outer的getInnerIterator方法獲取到這個(gè)傳入的迭代器參數(shù)Inner。你可以通過(guò)Outer的rewind(),next(),valid(),current()和key()方法對(duì)內(nèi)部迭代器Inner進(jìn)行處理。 重點(diǎn)理解
代碼演示<?php
namespace 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>';}運(yùn)行結(jié)果:young\OuterIterator::rewind call young\InnerIterator::rewind call young\InnerIterator::valid call young\InnerIterator::current call young\InnerIterator::key young\OuterIterator::valid young\OuterIterator::current young\OuterIterator::key 0=>2018-10-01_suffix young\OuterIterator::next call young\InnerIterator::next call young\InnerIterator::valid call young\InnerIterator::current call young\InnerIterator::key young\OuterIterator::valid young\OuterIterator::current young\OuterIterator::key 1=>2018-10-02_suffix young\OuterIterator::next call young\InnerIterator::next call young\InnerIterator::valid young\OuterIterator::valid
object(young\InnerIterator)#1 (2) {
[“dates”:“young\InnerIterator”:private]=> array(2) { [0]=>
string(10) “2018-10-01” [1]=> string(10) “2018-10-02” }
[“position”:“young\InnerIterator”:private]=> int(2) }結(jié)果分析Outer的每次迭代會(huì)先調(diào)用自己的方法,然后轉(zhuǎn)發(fā)給Inner。 一點(diǎn)補(bǔ)充之前在網(wǎng)上翻閱資料時(shí)會(huì)看到這樣的疑惑 //假如這里還是使用了上面的兩個(gè)類代碼
<?php
namespace young;
class InnerIterator implements \Iterator
{
//code 這里的代碼假如和上面的一樣
}
class OuterIterator extends \IteratorIterator
{
//code 這里的代碼假如和上面的一樣
}
$outer->valid(); //false
$outer->current(); // _suffix 問(wèn)題一
$outer->rewind();
$outer->valid(); //true
$outer->current(); //2018-10-01_suffix
$outer->next()
$outer->rewind();
$outer->current(); //2018-10-02_suffix 問(wèn)題二這里有兩個(gè)問(wèn)題,
從上面的運(yùn)行結(jié)果可知,$outer不執(zhí)行rewind,$inner也不會(huì)執(zhí)行,所以valid返回false,current為null,_suffix只是自己拼接上的。 以上就是對(duì)php中IteratorIterator的理解(代碼示例)的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章! 網(wǎng)站建設(shè)是一個(gè)廣義的術(shù)語(yǔ),涵蓋了許多不同的技能和學(xué)科中所使用的生產(chǎn)和維護(hù)的網(wǎng)站。 |
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!