RecursiveIteratorIterator中next()和nextElement()之间的区别

时间:2012-08-06 18:23:07

标签: php iterator spl

RecursiveIteratorIterator::next()RecursiveIteratorIterator::nextElement()之间的区别是什么?

文档略有帮助:

2 个答案:

答案 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  }

Source

在查看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()等...