Ben bir sınıf var ve ben belli bir dizi üye tekrarlatacak edebilmek istiyorum. Ben hızlı bir arama yaptım ve buldum IteratorAggregate
:
class foo implements IteratorAggregate
{
protected $_array = array('foo'=>'bar', 'baz'=>'quux');
public function getIterator()
{
return new ArrayIterator($this->_array);
}
}
hangi harika çalışıyor, ama bu yeni bir ArrayIterator
instance'a foreach
üzerinde kullanılan her zaman yaratmaz?
Ben de bir üyesi yineleyici örneğini saklamak gerektiğini düşündüm:
protected $_iterator;
public function getIterator()
{
if (!$this->_iterator instanceof ArrayIterator) {
$this->_iterator = new ArrayIterator($this->_array);
}
return $this->_iterator;
}
Sorun üyesi değişiklikler sonraki foreach
yapıları yansımıyor böylece yineleyici, getIterator()
ilk çağrı sırasında $this->_array
bir kopyasını kullanır.
Ben ArrayIterator
, bir setArray($array)
yöntemi eklemek ve getIterator()
bunu dönmeden önce onu aramak alt sınıfı, ama ben üye adını bilmiyorum düşünüyordum Dizi bu dahili kullanır ve bir alt sınıf tarafından overwriteable olsun veya olmasın.
Soru: Bu bir erken ve / veya gereksiz optimizasyonu nedir? Eğer hayır ise, bu ne ulaşmak için en iyi yolu nedir?