1

This Codeでの FilterIterator の動作を理解しようとしています。アクション シーケンスを理解しようとしていましたが、 current()値を出力しようとすると、 next()またはrewind()を使用しない限り機能しない理由がわかりませんでした。たとえば前に:

// Please take a look at the link before
echo $cull->current(); // wont work
$cull->next(); or $cull->rewind(); then echo $cull->current(); // work

要素を印刷できるようにするために「ポインター」を「更新」する必要があるかどうかわかりません。誰かがアクションシーケンスを説明してくれれば、より明確になるかもしれません。

4

2 に答える 2

1

あなたが最初にアクセスする前に呼び出しnext()たりしない場合、内部イテレータポインタは最初の要素に設定されていません...rewindcurrent()

一般的なシナリオはwhile($it->next())AFAIKです!

于 2012-09-17T06:58:21.643 に答える
1

これは、違うように聞こえるかもしれませんが、ここで尋ねたのと同じ質問です 。

受け入れられた回答とコメントを読んでください。ただし、要約すると、IteratorIterator が php ソース コードで記述されている方法は、機能的には次のようにモデル化されています。

class IteratorIterator {
    private $cachedCurrentValue;
    private $innerIterator;
    ...
    public function current() { return $this->cachedCurrentValue; }
    public function next() {
        $this->innerIterator->next();
        $this->cachedCurrentValue = $this->innerIterator->current();
    }
    public function rewind() {
        $this->innerIterator->rewind();
        $this->cachedCurrentValue = $this->innerIterator->current();
    }
}

重要な部分は、current() を呼び出すときに値が内部反復子から取得されないことですが、代わりに、他のときに取得されます (コンストラクターはそれらの 1 つではありません)。

個人的には、これは境界線上にあるバグだと思います。これは予想外であり、望ましくない動作やパフォーマンスの問題を引き起こすことなく解決できるからです。

于 2012-10-14T21:42:45.800 に答える