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  }

ソース

iterator クラスのデフォルト関数は、 spl_iterators.c:801nextElementを見ると、現時点では何もしていないようです。

現時点では、その関数に独自のコールバックを登録する方法がなく、PHP ソースでは何もしないため、ノーオペレーションのように見えます。コードを見ると、登録されている場合、そのコールバックは、イテレーターが次の要素に移動したときに呼び出されてから、アイテムに作用します (たとえば、foreach ループ内のユーザーランド コード)。

使用方法の説明については、@RamboCoder の回答を参照してください。

于 2012-08-06T18:36:33.677 に答える
3

テンプレート メソッドの設計パターンは、一部の spl クラスで発生します。これは 1 つの発生です。オプションのフックの実装を提供するために 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() などがあります...

于 2012-08-15T00:27:01.940 に答える