简单原理
1. PHP中将实现了接口Iterator中 的5个方法的类都称为iterator, 这5个方法是:
current()—返回当前元素值,
key()—返回当前元素的键值,
next()—下移一个元素,
valid()—判定是否还有后续元素, 如果有, 返回true,
rewind()—移到首元素.
常用的iterator有: DirectoryIterator, SimpleXMLIterator.
2. 递归iterator是实现了接口RecursiveIterator中的hasChildren()和getChildren()方法的类,
例如上面示例2中的RecursiveDirectoryIterator.
3. 示例3中显示了iterator 的链接, 也就是将一个iterator(可以称为源iterator)作为另一个iterator(可以称为目标iterator)的参数, 通常用于数据过滤.
常用的用于链接的iterator是FilterIterator 和LimitIterator.
FilterIterator是一个抽象类, 需要实现它的accept()方法作为过滤数据的规则,
而LimitIterator 是类, 用法是new LimitIterator(源iterator, 起始位, 个数) 用于获得指定个数的元素.
4. PHP中另提供IteratorAggregate接口, 用于将非iterator的类构造为iterator, 实际是实现该接口中的getIterator()方法.
Iterator的接口定义如下:
- 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 )
- }
下面是一个简单的例子演示Iterator的使用方法:
- <?php
- class myIterator implements Iterator {
- private $position = 0;
- private $array = array(
- "firstelement",
- "secondelement",
- "lastelement",
- );
- public function __construct() {
- $this->position = 0;
- }
- function rewind() {
- var_dump(__METHOD__);
- $this->position = 0;
- }
- function current() {
- var_dump(__METHOD__);
- return $this->array[$this->position];
- }
- function key() {
- var_dump(__METHOD__);
- return $this->position;
- }
- function next() {
- var_dump(__METHOD__);
- ++$this->position;
- }
- function valid() {
- var_dump(__METHOD__);
- return isset($this->array[$this->position]);
- }
- }
- $it = new myIterator;
- foreach($it as $key => $value) {
- var_dump($key, $value);
- echo "/n";
- }
- ?>
上面的例子会产生如下的输出:
- string(18) "myIterator::rewind"
- string(17) "myIterator::valid"
- string(19) "myIterator::current"
- string(15) "myIterator::key"
- int(0)
- string(12) "firstelement"
- string(16) "myIterator::next"
- string(17) "myIterator::valid"
- string(19) "myIterator::current"
- string(15) "myIterator::key"
- int(1)
- string(13) "secondelement"
- string(16) "myIterator::next"
- string(17) "myIterator::valid"
- string(19) "myIterator::current"
- string(15) "myIterator::key"
- int(2)
- string(11) "lastelement"
- string(16) "myIterator::next"
- string(17) "myIterator::valid"