迭代器有一个简单且常见的接口:
function Iterator($array) //构造函数。使需要遍历的数组作为一个参数
function reset() //设置内部指针指向第一个元素
function end() //设置内部指针指向最后一个元素
function seek($position) //设置内部指针指向一个指定的元素
function next() //返回后一个元素
function previous() //返回前一个元素
?>
通过此接口可在任何时间、任何地点及任何方法轻轻松松执行日常事务(例如数组遍历)。相对于PHP本身的数组函数,一大优势在于有了一个为所有数组任务工作的接口,避免了这类情况:一段代码里用foreach()构造,而另外一段用list和each的组合,然后还有其他地方频繁使用next()和perv();另一个优势是现在可以简单的定位于一个确定的元素并且可以从这里开始任何方式的遍历。
示例代码:
< ?php
$iterator = new Iterator($array);
while ($elem = $iterator->next()) { //遍历数组
echo $elem;
}
$iterator->end(); //反序便利
while ($elem = $iterator->previous()) {
echo $elem;
}
$iterator->seek(5); //从第五元素开始遍历
while ($elem = $iterator->next()) {
echo $elem;
}
?>
此外,可通过唯一的接口存取所有数组,另一个重要优势是迭代器的对象结构容许你轻松扩展它的功能。
对象迭代器接口
对象迭代器的代码十分简单:
class ObjectIterator extends Iterator {
var $_objectName;
/**
* 构造函数
* 调用初始化方法(参考Iterator::_initialize())
* 做一些特殊的配置
* @参数数组 $array 要遍历的对象id的数组
* @参数字符串 $objectName 要被创建的对象的类
*/
function ObjectIterator($array, $objectName) {
$this->_initialize($array);
$this->_objectName = $objectName;
}
/**
* 用给出的id返回对象
* @参数对象 $id 标示一个对象
* @返回对象 集合里的下一个对象
* @存取 私有
*/
function _fetchObject($id) {
return new $this->_objectName($id);
}
}
?>
类成员$_objectName代表对象所属的类它必须被next()和pervious()方法返回。构造函数设置内部变量并且调用初始化函数(已在迭代器类定义)。最重要的事情是_fetchObject()函数封装了对象创建的代码,它被next()和pervious()方法调用并且用对象的id作为参数),所有的对象创建代码都集中在这里,更容易改变和扩展。
这是创建新的一类迭代器的方法:第一、制作构造函数(有一个数组作为参数),调用从迭代器类_initialize()函数;第二、重载 _fetchObject方法去执行任何对象操作。