IteratorAggregate ile bir üye dizi yineleme

2 Cevap php

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?

2 Cevap

Sen ikinci kodu başka bitmeden yeni bir döngü başlayacak nesnenin birden döngüler üzerinde başarısız olur.

Gerçekten de üzerinde zaman harcamaya değer bir optimizasyonu gibi görünmüyordu.

ama bu her zaman foreach üzerinde kullanılan yeni bir ArrayIterator örneğini oluşturmak değil mi?

evet, ve?