迭代器
迭代器设计模式是指使用迭代器遍历容器。在 PHP 中,如果一个类最终继承了 Traversable 接口,那么该类就可以使用 foreach
结构进行遍历。不幸的是,这是一个抽象的基础接口,你不能单独实现它(除非你在 PHP 核心中编写)。相反,你必须实现名为 Iterator
或 IteratorAggregate
的接口。通过实现这两个接口中的任何一个,都可以使用 foreach
使一个类可迭代和遍历。
Iterator
和 IteratorAggregate
接口非常相似,但 IteratorAggregate
接口会创建一个外部迭代器。作为一个接口,IteratorAggregate
只需要一个方法,即 getIterator
。该方法必须返回 ArrayIterator
接口的实例。
迭代器聚合
假设我们想创建一个该接口的实现,它将遍历不同的时间。
首先,让我们从 IternatorAggregate
类的基本实现开始,了解它是如何工作的:
Unresolved include directive in modules/ROOT/pages/ch05/ch5-03.adoc - include::example$Chapter 5/Iterator/time.php[]
我们可以按如下方式迭代这个类:
<?php
class timeIterator implements IteratorAggregate {
public function getIterator()
{
return new ArrayIterator(array(
'property1' => 1,
'property2' => 2,
'property4' => 3
));
}
}
其输出如下:

我修改了这个脚本,使它能获取一个 time
值,然后计算两边的各种值,并使它们可以迭代:
Unresolved include directive in modules/ROOT/pages/ch05/ch5-03.adoc - include::example$Chapter 5/Iterator/time.php[]
该脚本的输出结果如下:

PHP 的众多迭代器
在此之前,我们已经探讨过 SPL(标准 PHP 库)中的一些函数,SPL 是接口和类的集合,其存在是为了解决常见问题。鉴于这一目的,它们与设计模式有着共同的目标,但它们都旨在以不同的方式解决这些问题。在 PHP 7 中构建和编译该扩展不需要任何外部库;事实上,你甚至无法禁用它。
作为该库的一部分,SPL 中有许多迭代器。您可以在 http://php.net/manual/en/spl.iterators.php 的文档中找到它们的列表。
下面是其中一些迭代器的列表,让您了解它们的用途:
-
AppendIterator
-
ArrayIterator
-
CachingIterator
-
CallbackFilterIterator
-
DirectoryIterator
-
EmptyIterator
-
FilesystemIterator
-
FilterIterator
-
GlobIterator
-
InfiniteIterator
-
IteratorIterator
-
LimitIterator
-
MultipleIterator
-
NoRewindIterator
-
ParentIterator
-
RecursiveArrayIterator
-
RecursiveCachingIterator
-
RecursiveCallbackFilterIterator
-
RecursiveDirectoryIterator
-
RecursiveFilterIterator
-
RecursiveIteratorIterator
-
RecursiveRegexIterator
-
RecursiveTreeIterator
-
RegexIterator