当然,也可以不同通过生成器来实现这个功能,而是可以通过继承 Iterator 接口实现。
通过使用生成器实现起来会更方便,而不用再去实现 iterator 接口中的 5
个方法了。
生成器为可中断的函数
要从生成器认识协同程序,理解它们内部是如何工作的非常重要:生成器是可中断
的函数,在它里面,yield
构成了中断点。
紧接着上面的例子,如果你调用 xrange(1,1000000)的话,xrange()函数里代码没有真
正地运行。相反,PHP
只是返回了一个实现了迭代器接口的 生成器类实例:
代码如下:
<?php
$range
= xrange(1, 1000000);
var_dump(
$range
);
// object(Generator)#1
var_dump(
$range
instanceof
Iterator);
// bool(true)
你对某个对象调用迭代器方法一次,其中的代码运行一次。例如,如果你调用
$range
-
>
rewind
(),那么 xrange()
里的代码运行到控制流 第一次出现 yield 的地方。在这种情况下,
这就意味着当
$i
=
$start
时 yield
$i
才运行。传递给 yield 语句的值是使用
$range
->current()获
取的。
为了继续执行生成器中的代码,你必须调用
$range
->next()方法。这将再次启动生成器,
直到 yield 语句出现。因此,连续调用 next()和 current()
方法 你将能从生成器里获得所有的