background image

PHP

入门 PHP 设计模式之迭代器模式

本文为大家详细分析介绍 PHP 设计模式中的迭代器模式,需要的朋友参考下
迭代器(Iterator)模式,它在一个很常见的过程上提供了一个抽象:位于对象图不明部
分的一组对象(或标量)集合上的迭代。迭代有几种不同的具体执行方法:在数组属性,
集合对象,数组,甚至一个查询结果集之上迭代。
在对象的世界里,迭代器模式要维持类似数组的功能,看作是一个非侵入性对象刻面
(facet),Client 类往往分离自真实对象实现,指 iterator 接口。只要有可能,我们可以给
迭代器传送一个引用,代替将来可能发生变化的具体或抽象类。
 
参与者:
◆客户端(Client):引用迭代器模式的方法在一组值或对象上执行一个循环。
◆迭代器(Iterator):在迭代过程上的抽象,包括 next(),isFinished(),current()等方法。
◆具体迭代器(ConcreteIterators):在一个特定的对象集,如数组,树,组合,集合等
上实现迭代。
通过 Traversable 接口,PHP 原生态支持迭代器模式,这个接口由 Iterator 和
IteratorAggregate 做了扩展,这两个子接口不仅是定义了一套标准的方法,每个
Traversable 对象都可以原封不动地传递给

foreach

(),

foreach

是迭代器的主要客户端,

Iterator 实现是真正的迭代器,而 IteratorAggregate 是有其它职责的 Traversable 对象,它通
过 getIterator()方法返回一个 Iterator。
 
标准 PHP 库是 PHP 中绑定的唯一通用目的面向对象库,定义了额外的接口和公用类 。
OuterIterator 实现装饰一个 Iterator,CachingIterator 和 LimitIterator 是这个接口的两个例子。
 
RecursiveIterator 是 Iterator 接口为树形结构实现的一个扩展,它定义了一组额外的方法检
查迭代中当前元素的子对象是否存在。RecursiveArrayIterator 和 RecursiveDirectoryIterator
是这个接口的实现示例,这些类型的迭代器可以原样使用,或是用一个
RecursiveIteratorIterator 桥接到一个普通的迭代器契约。这个 OuterIterator 实现将会根据构
造参数执行深度优先或广度优先遍历。
 
使用 RecursiveIteratorIterator 时,可以将其传递给

foreach

,请看后面的代码示例,了解

RecursiveIterators 的不同用法和它们的超集 Iterator。最后,SeekableIterators 向契约添加了
一个 seek()方法,它可以用于移动 Iterator

 

的内部状态到一个特定的迭代点。

 
注意,迭代器是比对象集更好的抽象,因为我们可以让
InfiniteIterators,NoRewindIterators 等,不用与普通数组阵列一致,因此,Iterator 缺少

count

()函数等功能。

在 PHP 官方手册中可以找到完整的 SPL 迭代器列表。得益于对 PHP 的强力支持,使用迭
代器模式的大部分工作都包括在标准实现中,下面的代码示例就利用了标准 Iterator 和