PHP生成器yield介绍

lys2019年11月26日 0条评论

PHP生成器yield介绍,首先我们编写如下代码:

function createRange($number){
    $data = [];    for($i=0;$i<$number;$i++){
        $data[] = time();
    }    return $data;
}
$result = createRange(10); // 这里调用上面我们创建的函数
foreach($result as $value){
    sleep(1);//这里停顿1秒,我们后续有用
    echo $value.'<br />';
}

我们在浏览器里面看一下运行结果,发现输出的时间会是一致的,

image.png

这没有任何问题。(当然sleep(1)效果你们看不出来)


思考一个问题

我们注意到,在调用函数createRange的时候给$number的传值是10,一个很小的数字。假设,现在传递一个值10000000(1000万)。

那么,在函数createRange里面,for循环就需要执行1000万次。且有1000万个值被放到$data里面,而$data数组在是被放在内存内。所以,在调用函数时候会占用大量内存。

这里,生成器就可以大显身手了。

创建生成器

我们直接修改代码,你们注意观察:

function createRange($number){ 
 
  for($i=0;$i<$number;$i++){ 
  
         yield time();
         
  }
  
}

看下这段和刚刚很像的代码,我们删除了数组$data,而且也没有返回任何内容,而是在time()之前使用了一个关键字yield

使用生成器

我们再运行一下第二段代码:

$result = createRange(10);//这里调用上面我们创建的函数


foreach($result as $value){

    sleep(1);    
    
    echo $value.'<br />';
    
}


image.png

发现时间不一致

更多请参考原文:https://segmentfault.com/a/1190000012334856