クラスがあり、特定の配列メンバーを反復できるようにしたいと考えています。簡単な検索を行ったところ、次のことがわかりました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()
たが、内部で使用している配列のメンバー名と、サブクラスで上書き可能かどうかがわかりません。
問題は、これは時期尚早または不必要な最適化ですか? いいえの場合、これを達成するための最良の方法は何ですか?