Let’s think about it. If we put the collection object and the operations on the collection object together, when we want to traverse the elements in the collection object in another way, we need to modify the collection object. Yes, it violates the "single responsibility principle", and the iterator pattern separates the data structure and the algorithm of the data structure, and the two can be developed independently.
The role of php iterator (Iterator):
Allows the object to iterate the internal data in its own way, so that it can be accessed iteratively, Iterator The interface summary is as follows:
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 ) }
Analysis of iterator advantages and disadvantages:
Advantages:
1. Supports multiple traversal methods . For example, in an ordered list, we provide two iterators for forward traversal and reverse order traversal as needed. Users only need to get our iterator to perform traversal operations on the collection
2. Simplified aggregate classes. Due to the introduction of iterators, the original collection object does not need to traverse the collection elements by itself
3. It is very convenient to add new aggregation classes and iterator classes, and the two dimensions can be changed independently
4. Provide a unified interface for different collection structures, thereby supporting the same algorithm to operate on different collection structures
Disadvantages:
The iterator pattern separates the responsibilities of storing data and traversing data. When adding a new collection object, you need to add a corresponding iterator class. The number of classes increases in pairs, which increases the system complexity to a certain extent.
The following is a simple example to demonstrate the use of Iterator:
<?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>'; } ?>
The above example will output:
第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
As can be seen from the above example, if valid is executed Return false and the loop ends.
For more related questions, please visit the PHP Chinese website: PHP Video Tutorial
The above is the detailed content of Detailed introduction to the role of php iterator. For more information, please follow other related articles on the PHP Chinese website!