Réfléchissons-y. Si nous mettons ensemble l'objet de collection et les opérations sur l'objet de collection, lorsque nous voulons parcourir les éléments de l'objet de collection d'une autre manière, nous devons le faire. modifier l'objet de collection. Oui, cela viole le « principe de responsabilité unique », et le modèle d'itérateur sépare la structure des données et l'algorithme de la structure des données, et les deux peuvent être développés indépendamment.
Le rôle de l'itérateur PHP (Iterator) :
Permet à l'objet d'itérer les données internes à sa manière, afin qu'elles soient accessibles de manière itérative , Itérateur Le résumé de l'interface est le suivant :
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 des avantages et des inconvénients de l'itérateur :
Avantages :
1 . Prend en charge plusieurs méthodes de traversée . Par exemple, dans une liste ordonnée, nous fournissons deux itérateurs pour le parcours direct et le parcours inverse selon les besoins. Les utilisateurs n'ont besoin que de demander à notre itérateur d'effectuer des opérations de parcours sur la collection
2. Classes d'agrégation simplifiées. En raison de l'introduction des itérateurs, l'objet de collection d'origine n'a pas besoin de parcourir les éléments de collection par lui-même
3. Il est très pratique d'ajouter de nouvelles classes d'agrégation et classes d'itérateur, et les deux dimensions peuvent être modifiées indépendamment.
4. Fournir une interface unifiée pour différentes structures de collection, prenant ainsi en charge le même algorithme pour fonctionner sur différentes structures de collection
Inconvénients :
Le modèle d'itérateur sépare les responsabilités de stockage des données et de parcours des données. Lors de l'ajout d'un nouvel objet de collection, vous devez ajouter une classe d'itérateur correspondante. Le nombre de classes augmente par paires, ce qui augmente la complexité du système dans une certaine mesure.
Ce qui suit est un exemple simple pour démontrer l'utilisation d'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>'; } ?>
L'exemple ci-dessus affichera :
第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
Comme le montre l'exemple ci-dessus , si valid est exécuté, renvoie false et la boucle se termine.
Pour plus de questions connexes, veuillez visiter le site Web PHP chinois : Tutoriel vidéo PHP
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!