php iterator 实现
实现 PHP Iterator 接口
在 PHP 中,可以通过实现 Iterator 接口来创建自定义的可迭代对象。Iterator 接口定义了以下方法:
Iterator extends Traversable {
public current(): mixed
public key(): mixed
public next(): void
public rewind(): void
public valid(): bool
}
基本实现示例
创建一个简单的迭代器类,遍历一个数组:

class MyIterator implements Iterator {
private $array = [];
private $position = 0;
public function __construct(array $array) {
$this->array = $array;
$this->position = 0;
}
public function rewind() {
$this->position = 0;
}
public function current() {
return $this->array[$this->position];
}
public function key() {
return $this->position;
}
public function next() {
++$this->position;
}
public function valid() {
return isset($this->array[$this->position]);
}
}
使用自定义迭代器
$data = ['apple', 'banana', 'cherry'];
$iterator = new MyIterator($data);
foreach ($iterator as $key => $value) {
echo "Key: $key, Value: $value\n";
}
实现 Generator 的替代方案
PHP 5.5+ 提供了生成器(Generator)作为更简单的迭代器实现方式:

function myGenerator(array $array) {
foreach ($array as $key => $value) {
yield $key => $value;
}
}
$data = ['apple', 'banana', 'cherry'];
foreach (myGenerator($data) as $key => $value) {
echo "Key: $key, Value: $value\n";
}
实现 IteratorAggregate 接口
对于更复杂的场景,可以实现 IteratorAggregate 接口,它只需要实现一个 getIterator() 方法:
class MyCollection implements IteratorAggregate {
private $items = [];
public function addItem($item) {
$this->items[] = $item;
}
public function getIterator() {
return new ArrayIterator($this->items);
}
}
$collection = new MyCollection();
$collection->addItem('apple');
$collection->addItem('banana');
foreach ($collection as $item) {
echo $item . "\n";
}
实现 SeekableIterator 接口
如果需要随机访问功能,可以实现 SeekableIterator 接口:
class MySeekableIterator implements SeekableIterator {
private $array = [];
private $position = 0;
public function __construct(array $array) {
$this->array = $array;
}
public function seek($position) {
if (!isset($this->array[$position])) {
throw new OutOfBoundsException("Invalid position ($position)");
}
$this->position = $position;
}
// 实现其他 Iterator 方法...
}
注意事项
- 迭代器对象在遍历后不会自动重置,需要手动调用
rewind()或重新创建实例 - 生成器函数只能使用一次,遍历完成后需要重新调用生成器函数
- 对于大型数据集,生成器可以节省内存,因为它们不需要一次性加载所有数据






