上QQ阅读APP看书,第一时间看更新
4.6.1 使用生成器迭代数据
在使用生成器迭代数据时,通常是创建一个生成器函数。生成器函数看起来像一个普通的函数,但不同的是普通函数返回一个值,而一个生成器可以生成许多它所需要的值,并且每次的产出值只是暂停当前的执行状态,当下次调用生成器函数时,PHP会从上次暂停的状态继续执行下去。
当一个生成器被调用的时候,它返回一个可以被遍历的对象。当遍历这个对象的时候,PHP将会在每次需要值的时候调用生成器函数,并在产生一个值后保存生成器的状态,这样它就可以在需要产生下一个值的时候恢复调用状态。
一旦不再需要产生更多的值,生成器函数可以简单退出,而调用生成器的代码还可以继续执行,就像一个数组已经被遍历完了。
生成器函数的核心是yield关键字。它最简单的调用形式看起来像一个return申明,不同之处在于普通return会返回值并终止函数的执行,而yield会返回一个值给循环调用此生成器的代码,并且只是暂停执行生成器函数。
【例4-22】生成器的应用(实例文件:源文件\ch04\4.22.php)。
运行结果如图4-23所示。
图4-23 生成器的应用
注意:生成器yield关键字不是返回值,它叫产出值,只是生成一个值。
上面代码中foreach循环的是什么?其实是PHP在使用生成器的时候,会返回一个Generator类的对象。foreach可以对该对象进行迭代,每次迭代,PHP会通过Generator实例计算出下一次需要迭代的值。这样foreach就知道下一次需要迭代的值了。而且,在运行中for循环执行后,会立即停止,等待foreach下次循环的时候再次向for索要下次的值的时候,for循环才会再执行一次,然后立即再次停止,直到不满足条件则结束。