background image

 

  当然,也可以不同通过生成器来实现这个功能,而是可以通过继承 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()

 

方法 你将能从生成器里获得所有的