PHP迭代生成器的理解和使用

参考鸟哥博客
laravel-china文章

个别重点自己在此记录下,希望大家还是参考鸟哥博客的那个文章

迭代生成器

(迭代)生成器也是一个函数,不同的是这个函数的返回值是依次返回( 迭代生成器其实是生成了一个对象),而不是只返回一个单独的值.

或者,换句话说,生成器使你能更方便的实现了迭代器接口.下面通过实现一个xrange函数来简单说明:

function xrange($start,$end,$step=1){
    for ($i=$start; $i<=$end; $i+=$step){
        yield $i;
    }
}
//xrange(1,10) ;
foreach (xrange(1,10,2) as $key=>$num){
    echo $key.'=>'.$num.'
'; } // 打印 0=>1 1=>3 2=>5 3=>7 4=>9 function xrange($start,$end,$step=1){ for ($i=$start; $i<=$end; $i+=$step){ yield $i; } } var_dump(xrange(1,10,2)); // 打印得到 object(Generator)#1 (0) { }
鸟哥原本的例子是

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

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

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

使用数组

function xrange($start,$end,$step=1){
    for ($i=$start; $i<=$end; $i+=$step){
        echo $i.'
'; } } xrange(1,10,2); // 打印 1 3 5 7 9

生成器为可中断的函数

要从生成器认识协程, 理解它内部是如何工作是非常重要的: 生成器是一种可中断的函数, 在它里面的yield构成了中断点.

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


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

你可能感兴趣的:(PHP迭代生成器的理解和使用)