
PHP生成器yield介绍
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 />'; }
我们在浏览器里面看一下运行结果,发现输出的时间会是一致的,
这没有任何问题。(当然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 />'; }
发现时间不一致
更多请参考原文:https://segmentfault.com/a/1190000012334856