1. 程式人生 > >PHP迭代器的小坑

PHP迭代器的小坑

使用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。程式簡單的時候一般不會遇到這個問題,不過當程式複雜的時候,儘量還是避免迭代器之間的干擾。