php生成器yield

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php生成器yield脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

迭代生成

(迭代)生成器也是一个函数,不同的是这个函数的返回值是依次返回,而不是只返回一个单独的值.或者,换句话说,生成器使你能更方便的实现了迭代器接口.下面通过实现一个xrange函数简单说明:

<?PHP
function xrange($start,$end,$step = 1) {
    for ($i = $start; $i <= $end; $i += $step) {
        yield $i;        // yield关键字类似return关键字的作用,都是在函数中返回一个值,而return是返回后执行析构函数,终止函数,yield是返回一个值,中断函数,并记住当前位置
    }
}
 
foreach (xrange(1,1000000) as $num) {
    echo $num,"\n";
}

上面这个xrange()函数提供了和PHP的内建函数range()一样的功能.但是不同的是range()函数返回的是一个包含值从1到100万的数组(注:请查看手册). 而xrange()函数返回的是依次输出这些值的一个迭代器,而不会真正以数组形式返回.

这种方法的优点是显而易见的.它可以让你在处理大数据集合的时候不用一次性的加载到内存中.甚至你可以处理无限大的数据流.

当然,也可以不同通过生成器来实现这个功能,而是可以通过继承ITerator接口实现.但通过使用生成器实现起来会更方便,不用再去实现iterator接口中的5个方法了.

生成器为可中断的函数

生成器是一种可中断的函数,在它里面的yield构成了中断点.

还是看上面的例子,调用xrange(1,1000000)的时候,xrange()函数代码其实并没有真正地运行. 它只是返回了一个迭代器:

<?PHP
$range = xrange(1,1000000);
var_dump($range); // object(Generator)#1
VAR_dump($range instanceof Iterator); // bool(true)
?>

这也解释了为什么xrange叫做迭代生成器,因为它返回一个迭代器,而这个迭代器实现了Iterator接口.

调用迭代器的方法一次,其中的代码运行一次.例如,如果你调用\(range->rewind(),那么xrange()里的代码就会运行到控制流第一次出现yield的地方. 而函数内传递给yield语句的返回值可以通过\)range->current()获取.

为了继续执行生成器中yield后的代码,你就需要调用$range->next()方法. 这将再次启动生成器,直到下一次yield语句出现. 因此,连续调用next()和current()方法,你就能从生成器里获得所有的值,直到再没有yield语句出现.

xrange()来说,这种情形出现在\(i超过\)end时. 在这中情况下,控制流将到达函数的终点,因此将不执行任何代码.一旦这种情况发生,vaild()方法将返回假,这时迭代结束.

脚本宝典总结

以上是脚本宝典为你收集整理的php生成器yield全部内容,希望文章能够帮你解决php生成器yield所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。