Lassen Sie uns darüber nachdenken. Wenn wir das Sammlungsobjekt und die Operationen für das Sammlungsobjekt zusammenfügen, müssen wir die Elemente im Sammlungsobjekt auf andere Weise durchlaufen Ändern Sie das Sammlungsobjekt. Ja, es verstößt gegen das „Prinzip der Einzelverantwortung“, und das Iteratormuster trennt die Datenstruktur und den Algorithmus der Datenstruktur, und beide können unabhängig voneinander entwickelt werden.
Die Rolle des PHP-Iterators (Iterator):
Ermöglicht dem Objekt, die internen Daten auf seine eigene Weise zu iterieren, sodass iterativ darauf zugegriffen werden kann , Iterator Die Schnittstellenzusammenfassung lautet wie folgt:
Iterator extends Traversable { //返回当前索引游标指向的元素 abstract public mixed current ( void ) //返回当前索引游标指向的键 abstract public scalar key ( void ) //移动当前索引游标到下一元素 abstract public void next ( void ) //重置索引游标 abstract public void rewind ( void ) //判断当前索引游标指向的元素是否有效 abstract public boolean valid ( void ) }
Analyse der Vor- und Nachteile von Iteratoren:
Vorteile:
1 . Unterstützt mehrere Traversalmethoden. Beispielsweise stellen wir in einer geordneten Liste je nach Bedarf zwei Iteratoren für die Durchquerung in Vorwärtsrichtung und die Durchquerung in umgekehrter Reihenfolge bereit. Benutzer müssen nur unseren Iterator dazu bringen, Durchlaufoperationen für die Sammlung durchzuführen
2. Vereinfachte Aggregatklassen. Aufgrund der Einführung von Iteratoren muss das ursprüngliche Sammlungsobjekt die Sammlungselemente nicht selbst durchlaufen
3 Es ist sehr praktisch, neue Aggregationsklassen und Iteratorklassen hinzuzufügen, und die beiden Dimensionen können unabhängig voneinander geändert werden
4. Stellen Sie eine einheitliche Schnittstelle für verschiedene Sammlungsstrukturen bereit und unterstützen Sie so den gleichen Algorithmus für die Arbeit mit verschiedenen Sammlungsstrukturen
Nachteile:
Das Iteratormuster trennt die Verantwortlichkeiten für das Speichern von Daten und das Durchlaufen von Daten. Wenn Sie ein neues Sammlungsobjekt hinzufügen, erhöht sich die Anzahl der Klassen paarweise, was die Systemkomplexität bis zu einem gewissen Grad erhöht.
Das Folgende ist ein einfaches Beispiel, um die Verwendung von Iterator zu demonstrieren:
<?php /** * 该类允许外部迭代自己内部私有属性$_test,并演示迭代过程 * * @author 疯狂老司机 */ class TestIterator implements Iterator { /* * 定义要进行迭代的数组 */ private $_test = array('dog', 'cat', 'pig'); /* * 索引游标 */ private $_key = 0; /* * 执行步骤 */ private $_step = 0; /** * 将索引游标指向初始位置 * * @see TestIterator::rewind() */ public function rewind() { echo '第'.++$this->_step.'步:执行 '.__METHOD__.'<br>'; $this->_key = 0; } /** * 判断当前索引游标指向的元素是否设置 * * @see TestIterator::valid() * @return bool */ public function valid() { echo '第'.++$this->_step.'步:执行 '.__METHOD__.'<br>'; return isset($this->_test[$this->_key]); } /** * 将当前索引指向下一位置 * * @see TestIterator::next() */ public function next() { echo '第'.++$this->_step.'步:执行 '.__METHOD__.'<br>'; $this->_key++; } /** * 返回当前索引游标指向的元素的值 * * @see TestIterator::current() * @return value */ public function current() { echo '第'.++$this->_step.'步:执行 '.__METHOD__.'<br>'; return $this->_test[$this->_key]; } /** * 返回当前索引值 * * @return key * @see TestIterator::key() */ public function key() { echo '第'.++$this->_step.'步:执行 '.__METHOD__.'<br>'; return $this->_key; } } $iterator = new TestIterator(); foreach($iterator as $key => $value){ echo "输出索引为{$key}的元素".":$value".'<br><br>'; } ?>
Das obige Beispiel gibt Folgendes aus:
第1步:执行 TestIterator::rewind 第2步:执行 TestIterator::valid 第3步:执行 TestIterator::current 第4步:执行 TestIterator::key 输出索引为0的元素:dog 第5步:执行 TestIterator::next 第6步:执行 TestIterator::valid 第7步:执行 TestIterator::current 第8步:执行 TestIterator::key 输出索引为1的元素:cat 第9步:执行 TestIterator::next 第10步:执行 TestIterator::valid 第11步:执行 TestIterator::current 第12步:执行 TestIterator::key 输出索引为2的元素:pig 第13步:执行 TestIterator::next 第14步:执行 TestIterator::valid
Wie aus dem obigen Beispiel ersichtlich ist , wenn valid ausgeführt wird. Geben Sie false zurück und die Schleife endet.
Für weitere verwandte Fragen besuchen Sie bitte die chinesische PHP-Website: PHP-Video-Tutorial
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die Rolle des PHP-Iterators. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!