4

RecursiveIteratorIterator::next()和 和有什么不一样RecursiveIteratorIterator::nextElement()

该文档的帮助不大:

4

2 回答 2

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 的答案。

于 2012-08-06T18:36:33.677 回答
3

模板方法设计模式出现在一些 spl 类中,这是一种情况。您应该扩展 RecursiveIteratorIterator 以提供可选挂钩的实现,然后超类 (RecursiveIteratorIterator) 将在适当的时间调用它们。

class A extends RecursiveIteratorIterator {
    function nextElement() {
        echo 'hi';
    }

}

$r = new A(new RecursiveArrayIterator([1,2]));
iterator_to_array($r);//hihi

You could think of nextElement() as an event handler, except you need to extend the class to provide an implementation of a handler.

Some of the other methods you can hook into are beginChildren() beginIteration() callHasChildren() etc...

于 2012-08-15T00:27:01.940 回答