بالتكرار عبر مجموعة عضوا مع IteratorAggregate
سؤال
ولدي فئة وأريد أن أكون قادرة على تكرار عبر عضو صفيف معينة. لقد فعلت ذلك لبحث سريع وجدت 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()
، ولكن أنا لا أعرف اسم عضو في مجموعة يستخدم داخليا وعما إذا كان أو لم يكن هو overwriteable من فئة فرعية.
والسؤال هو: هل هذا التحسين سابق لأوانه و / أو غير ضرورية؟ إذا لا، ما هي أفضل طريقة لتحقيق ذلك؟
المحلول
وسوف تفشل رمز الثاني على حلقات متعددة من الجسم حيث تبدأ حلقة جديدة قبل انتهاء آخر.
لا تبدو حقا مثل الأمثل يستحق قضاء الوقت على أي.
نصائح أخرى
ولكن لا أن إنشاء مثيل ArrayIterator جديد يستخدم كل foreach الوقت على ذلك؟
اقتباس فقرة>نعم، و؟