iterator
【百度词条】:迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。 从定义可见,迭代器模式是为容器而生。很明显,对容器对象的访问必然涉及到遍历算法。你可以一股脑的将遍历方法塞到容器对象中去;或者根本不去提供什么遍历算法,让使用容器的人自己去实现去吧。这两种情况好像都能够解决问题。在各编程语言的实现中:遍历器是一种接口,为各种不同的数据结构提供统一访问机制。
迭代器其实就是一种具有迭代属性和方法的数据对象。
Iterator(迭代器)接口【PHP官方文档】
可在内部迭代自己的外部(这里所谓的外部是指运行时迭代器使用了外部创建的迭代属性和方法的类或接口)迭代器或类的接口。
<?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";
}
?>
接口摘要
Iterator extends Traversable
{
/* 方法 */
abstract public current ( void ) : mixed
abstract public key ( void ) : scalar
abstract public next ( void ) : void
abstract public rewind ( void ) : void
abstract public valid ( void ) : bool
}
Iterator extends Traversable
{
/* 方法 */
abstract public current ( void ) : mixed
abstract public key ( void ) : scalar
abstract public next ( void ) : void
abstract public rewind ( void ) : void
abstract public valid ( void ) : bool
}
Traversable:
检测一个类是否可以使用 foreach 进行遍历的接口。
无法被单独实现的基本抽象接口。相反它必须由 IteratorAggregate 或 Iterator 接口实现。
Note:
实现此接口的内建类可以使用 foreach 进行遍历而无需实现 IteratorAggregate 或 Iterator 接口。
Note:
这是一个无法在 PHP 脚本中实现的内部引擎接口。IteratorAggregate 或 Iterator 接口可以用来代替它。
这个接口没有任何方法,它的作用仅仅是作为所有可遍历类的基本接口。
预定义迭代器
PHP 已经提供了一些用于日常任务的迭代器。 详细列表参见 SPL 迭代器。
IteratorAggregate(聚合式迭代器)接口
创建外部(这里所谓的外部是指运行时迭代器使用了外部创建的迭代属性和方法的类或接口)迭代器的接口。
<?php
class myData implements IteratorAggregate
{
public $property1 = "Public property one";
public $property2 = "Public property two";
public $property3 = "Public property three";
public function __construct()
{
$this->property4 = "last property";
}
public function getIterator()
{
return new ArrayIterator($this);
}
}
$obj = new myData;
foreach($obj as $key => $value)
{
var_dump($key, $value);
echo "\n";
}
?>
总结:需要理解的概念都很清晰简单,在概念里唯一出现的“外部迭代-内部迭代”。其实无论是内部还是外部指的都是具有迭代属性的数据和方法对象。内部迭代不过是继承迭代基础接口,继承覆盖父类方法自定义操作。而外部迭代器(聚合式迭代器)是指通过对象类的外部获得的迭代器,对象本身不具有迭代器的基类属性和方法。