yield是php提供的迭代器的使用关键字
一般php使用foreach时会拷贝传入的数组参数,然后一直循环完所有元素,如果是很大的数组或集合,那么通过foreach写入内存很可能造成充满内存或超时(默认30秒),如果在循环中使用yield,那么循环就不会产生上述现象,因为迭代器是一次执行一个循环,然后会交出程序的控制权,运行其他程序,待其他程序执行完再次切换回来继续执行,直至循环完毕返回false,迭代器也就终止。
function gen() {
$ret = (yield 'yield1');
var_dump($ret);
$ret = (yield 'yield2');
var_dump($ret);
}
$gen = gen();
var_dump($gen->current()); // string(6) "yield1"
var_dump($gen->send('ret1')); // string(4) "ret1" (the first var_dump in gen)
// string(6) "yield2" (the var_dump of the ->send() return value)
var_dump($gen->send('ret2')); // string(4) "ret2" (again from within gen)
// NULL (the return value of ->send())
迭代器指一个集合,能用next不断产生下一个元素的集合,直至完结,返回false,但是还不止是一个结合,因为迭代器可以包含无限个元素,一般的结合(数组、对象、结果集。。)不可能包含无限个元素,机器不允许,而且,迭代器的工作是惰性的,你需要的时候会给你产生你要的数据,不需要的时候,不会产生详情的数据,这就区别于用foreach循环一个数组的时候,会一下将整个数据拷贝加入内存中。