不同于 Iterator 接口,IteratorAggregate 接口只提供了一个 getIterator 方法,它的返回值是一个 Iterator 迭代的对象,主要适用于需要将遍历和数据分离的处理情况。
IteratorAggregate 迭代器的基本使用
以下是基本的迭代器使用示例
php
class AIteratorIteratorAggregate implements IteratorAggregate
{
private $data;
public function __construct($data = null)
{
$this->data = $data;
}
public function getIterator(): Traversable
{
return new ArrayIterator($this->data);
}
}
class Demo
{
public $property1 = "Public property one";
public $property2 = "Public property two";
public $property3 = "Public property three";
private $property5 = "private property five";
public function __construct()
{
$this->property4 = "last property";
}
}
$AIterator = new AIteratorIteratorAggregate((new Demo()));
foreach ($AIterator as $key => $item) {
var_dump($key, $item);
}
迭代结果:
string(9) "property1"
string(19) "Public property one"
string(9) "property2"
string(19) "Public property two"
string(9) "property3"
string(21) "Public property three"
string(9) "property4"
string(13) "last property"
从上边的迭代结果可以看出,聚合迭代器可以迭代类的公有属性,但是对于类的私有属性却无法迭代。聚合迭代器通常结合 spl 的一些内置迭代器进行工作,他们包括:
常用的 spl 迭代器
下边是一些常用迭代器的列表,具体的使用将在后续的文章中介绍,这里仅作一个简单的介绍
迭代器 | 简介 |
---|---|
AppendIterator | 连续迭代其他迭代器的迭代器 |
ArrayIterator | 数组迭代器 |
CachingIterator | 对另一个对象的缓存进行迭代 |
CallbackFilterIterator | 回调迭代器,在迭代时使用函数过滤 |
DirectoryIterator | 目录文件遍历迭代器 |
EmptyIterator | 返回一个空的迭代器,当返回对象必须是迭代器类型时可以使用 |
FilesystemIterator | 文件系统迭代器 |
FilterIterator | 数据过滤迭代器 |
GlobIterator | |
InfiniteIterator | 持续迭代器,一次迭代结束后,会再次从开始位置从新迭代 |
IteratorIterator | 通用的迭代器,所有实现了 Traversable 接口的迭代器都可以被迭代 |
LimitIterator | 返回给定数量的结果以及从集合中取出结果的起始索引点 |
MultipleIterator | 顺序迭代迭代器的连接器 |
NoRewindIterator | 只能迭代一次的迭代器 |
ParentIterator | 扩展的 FilterIterator 迭代器,可以过滤掉来自于 RecursiveIterator 迭代器的非父元素。 |
RecursiveArrayIterator | 创建一个用于递归形式数组结构的迭代器,类似于多维数组。 |
RecursiveCachingIterator | 在 RecursiveIterator 迭代器上执行提前读取一个元素的递归操作。 |
RecursiveCallbackFilterIterator | 在 RecursiveIterator 迭代器上进行递归操作,同时执行过滤和回调操作 |
RecursiveDirectoryIterator | 递归目录文件遍历器,可实现列出所有目录层次结构,而不是只操作一个目录 |
RecursiveFilterIterator | 是 FilterIterator 迭代器的递归形式,也要求实现抽象的 accept()方法,但在这个方法中应该使用$this->getInnerIterator()方法访问当前正在迭代的迭代器。 |
RecursiveIteratorIterator | 将一个树形结构的迭代器展开为一维结构 |
RecursiveRegexIterator | 是 RegexIterator 迭代器的递归形式,只接受 RecursiveIterator 迭代器作为迭代对象。 |
RecursiveTreeIterator | 以可视在方式显示一个树形结构 |
RegexIterator | 继承 FilterIterator,支持使用正则表达式模式匹配和修改迭代器中的元素。经常用于将字符串匹配。 |