RecursiveIteratorIterator::next()
和RecursiveIteratorIterator::nextElement()
之间的区别是什么?
文档略有帮助:
RecursiveIteratorIterator :: next - 前进到下一个元素
RecursiveIteratorIterator :: nextElement - 下一个元素
...
下一个元素可用时调用。
答案 0 :(得分:3)
从PHP源代码看,nextElement
似乎是一个回调函数,当下一个元素可用时,可以调用它。“
288 if (object->nextElement && (object->mode == RIT_SELF_FIRST || object->mode == RIT_CHILD_FIRST)) {
289 zend_call_method_with_0_params(&zthis, object->ce, &object->nextElement, "nextelement", NULL);
290 }
在查看spl_iterators.c:801时,迭代器类中的默认nextElement
函数似乎没有做任何事情。
现在它看起来像一个无操作,因为无法为该函数注册自己的回调,而在PHP源代码中,它当前什么也没做。从查看代码,如果注册后,当迭代器移动到下一个元素时,在对项目执行操作之前调用该回调(例如,foreach循环中的用户区代码)。
请参阅@ RamboCoder的答案,了解如何使用它。
答案 1 :(得分:3)
模板方法设计模式在某些spl类中出现,这是一次。您应该扩展RecursiveIteratorIterator以提供可选挂钩的实现,然后超类(RecursiveIteratorIterator)将在适当的时间调用它们。
class A extends RecursiveIteratorIterator {
function nextElement() {
echo 'hi';
}
}
$r = new A(new RecursiveArrayIterator([1,2]));
iterator_to_array($r);//hihi
您可以将nextElement()视为事件处理程序,除非您需要扩展该类以提供处理程序的实现。
您可以使用的其他一些方法是beginChildren()beginIteration()callHasChildren()等...