PHP设计模式 - 迭代器模式

匿名 (未验证) 提交于 2019-12-02 22:11:45

迭代器模式 (Iterator),又叫做游标(Cursor)模式。提供一种方法访问一个容器(Container)对象中各个元素,而又不需暴露该对象的内部细节。

当你需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑使用迭代器模式。另外,当需要对聚集有多种方式遍历时,可以考虑去使用迭代器模式。迭代器模式为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。

php标准库(SPL)中提供了迭代器接口 Iterator,要实现迭代器模式,实现该接口即可。

 

<?php class sample implements Iterator {     private $_items ;      public function __construct(&$data) {         $this->_items = $data;     }     public function current() {         return current($this->_items);     }      public function next() {         next($this->_items);        }      public function key() {         return key($this->_items);     }      public function rewind() {         reset($this->_items);     }      public function valid() {                                                                                       return ($this->current() !== FALSE);     } }  // client $data = array(1, 2, 3, 4, 5); $sa = new sample($data); foreach ($sa AS $key => $row) {     echo $key, ‘ ‘, $row, ‘<br />‘; } /* 输出: 0 1 1 2 2 3 3 4 4 5 */  //Yii FrameWork Demo class CMapIterator implements Iterator { /** * @var array the data to be iterated through */     private $_d; /** * @var array list of keys in the map */     private $_keys; /** * @var mixed current key */     private $_key;  /** * Constructor. * @param array the data to be iterated through */     public function __construct(&$data) {         $this->_d=&$data;         $this->_keys=array_keys($data);     }  /** * Rewinds internal array pointer. * This method is required by the interface Iterator. */     public function rewind() {                                                                                          $this->_key=reset($this->_keys);     }  /** * Returns the key of the current array element. * This method is required by the interface Iterator. * @return mixed the key of the current array element */     public function key() {         return $this->_key;     }  /** * Returns the current array element. * This method is required by the interface Iterator. * @return mixed the current array element */     public function current() {         return $this->_d[$this->_key];     }  /** * Moves the internal pointer to the next array element. * This method is required by the interface Iterator. */     public function next() {         $this->_key=next($this->_keys);     }  /** * Returns whether there is an element at current position. * This method is required by the interface Iterator. * @return boolean */     public function valid() {         return $this->_key!==false;     } }  $data = array(‘s1‘ => 11, ‘s2‘ => 22, ‘s3‘ => 33); $it = new CMapIterator($data); foreach ($it as $row) {     echo $row, ‘<br />‘; }  /* 输出: 11 22 33 */ ?> 

 

原文:https://www.cnblogs.com/taozi32/p/9226824.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!