PHP迭代器的小坑
阿新 • • 發佈:2019-01-26
使用PHP迭代器的時候,需要主要到很多迭代器是對內部迭代器的封裝,當外部迭代器移動的時候,實際上也是在移動內部迭代器。
示例一:命令列
&"C:\wamp64\bin\php\php7.1.3\php.exe" -r '$a = new ArrayObject([7,8,9]); $b = $a->getIterator(); $c = new CachingIterator($b, CachingIterator::FULL_CACHE); echo $c->count(); $c->next(); echo $c->count(); echo $c->current(); echo $b->current(); $c->next(); echo $c->count(); echo $c->current(); echo $b->current();'
示例一:原始碼
$a = new ArrayObject([7,8,9]);
$b = $a->getIterator();
$c = new CachingIterator($b, CachingIterator::FULL_CACHE);
echo $c->count(); //0
$c->next();
echo $c->count(); //1
echo $c->current(); //7
echo $b->current(); //8
$c->next();
echo $c->count(); //2
echo $c->current(); //8
echo $b->current(); //9
可以看出,雖然類的名字叫Caching,而且設定了FULL_CACHE選項,但是並沒有快取全部資料,而是訪問一項,快取一項,同時也在移動內部迭代器。
示例二:命令列
&"C:\wamp64\bin\php\php7.1.3\php.exe" -r '$a = new ArrayObject([7,8,9]); $b = $a->getIterator(); $c = $a->getIterator(); echo $c->count(); $c->next(); echo $c->count(); echo $c->current(); echo $b->current(); $c->next(); echo $c->count(); echo $c->current(); echo $b->current();'
示例二:原始碼
$a = new ArrayObject([7,8,9]);
$b = $a->getIterator();
$c = $a->getIterator();
echo $c->count(); //3
$c->next();
echo $c->count(); //3
echo $c->current(); //8
echo $b->current(); //7
$c->next();
echo $c->count(); //3
echo $c->current(); //9
echo $b->current(); //7
可以看出此處的兩個迭代器互不影響。
簡單的說,如果希望對同一個資料迭代而且互不影響,那麼應當先轉成資料,然後建立ArrayIterator。程式簡單的時候一般不會遇到這個問題,不過當程式複雜的時候,儘量還是避免迭代器之間的干擾。