2

クラスがあり、特定の配列メンバーを反復できるようにしたいと考えています。簡単な検索を行ったところ、次のことがわかりましたIteratorAggregate

class foo implements IteratorAggregate
{
    protected $_array = array('foo'=>'bar', 'baz'=>'quux');

    public function getIterator()
    {
        return new ArrayIterator($this->_array);
    }
}

ArrayIteratorこれはうまく機能しますが、使用されるたびに新しいインスタンスが作成されませんforeachか?

したがって、イテレータ インスタンスをメンバーに格納する必要があると考えました。

    protected $_iterator;

    public function getIterator()
    {
        if (!$this->_iterator instanceof ArrayIterator) {
            $this->_iterator = new ArrayIterator($this->_array);
        }
        return $this->_iterator;
    }

問題は、反復子が$this->_arrayの最初の呼び出し中に のコピーを使用するgetIterator()ため、メンバーへの変更が後続の構成に反映されないことforeachです。

をサブクラス化し、メソッドをArrayIterator追加しsetArray($array)て呼び出してから に戻すべきだと思っていましgetIterator()たが、内部で使用している配列のメンバー名と、サブクラスで上書き可能かどうかがわかりません。

問題は、これは時期尚早または不必要な最適化ですか? いいえの場合、これを達成するための最良の方法は何ですか?

4

2 に答える 2

4

しかし、それは foreach が使用されるたびに新しい ArrayIterator インスタンスを作成しませんか?

はいそして?

于 2008-12-01T17:13:31.340 に答える
4

2 番目のコードは、別のループが終了する前に新しいループを開始するオブジェクトの複数のループで失敗します。

どちらにも時間を費やす価値のある最適化のようには見えませんでした。

于 2008-12-01T17:02:22.453 に答える