標準current
key
和next
函數似乎忽略迭代器子類方法。如何使Iterator子類方法遵守數組指針函數?
在這個例子中,我只是覆蓋Iterator::current
方法返回一個修改過的字符串。看來我的方法與父類有不同的狀態。它不能訪問相同的指針,並且在實例上調用current()
時它不會觸發。
<?php
class DecoratingIterator extends ArrayIterator {
public function current(){
return '**'.strtoupper(parent::current()).'**';
}
}
$test = new DecoratingIterator(['foo','bar']);
next($test);
echo $test->current(),"\n";
// prints "**FOO**"
echo current($test),"\n";
// prints "bar"
我敢肯定,這是預期的行爲,但有沒有辦法讓我的子類方法的工作時,PHP函數調用就可以了?
我不確定,但我認爲'next()'和它的朋友根本不使用接口'Iterator'的方法。它們修改數組的內部指針,而迭代器是保持迭代狀態(通過數組或其他數據結構)的外部類。將函數['next()'](http://php.net/manual/en/function.next.php)的文檔與方法['Iterator :: next()'](http:// php.net/manual/en/iterator.next.php)。迭代器被設計爲使用'foreach',而舊函數current(),next()'有不同的工作方式。 – axiac
一個很好的閱讀:https://nikic.github.io/2012/03/28/Understanding-PHPs-internal-array-implementation.html –
@axiac next和朋友可以使用像ArrayIterator這樣的本地迭代器,但是你'他們的工作方式不同,不應該被稱爲自定義對象。這是讓我困惑的子類怪癖。我把一個小小的Gist顯示出來:https://gist.github.com/timwhitlock/d791a357520f73b4d2f9 – Tim