GeneratorOverviewPHP从5.5.0版本开始支持Generators。根据PHP官方文档介绍:Generators提供了一种更简单的方式来实现简单的对象迭代,与定义类来实现Iterator接口的方式相比,性能开销和复杂度大大降低。所以生成器首先是一个迭代器(Iterator),也就是说可以使用foreach来遍历它。生成器就像一个返回数组的函数,它可以接收参数并被调用。我们以range()函数为例,将其实现为生成器:getReturn();//1但是有一个前提是生成器已经完成迭代,否则会报如下错误:PHPFatalerror:UncaughtException:Cannotgetreturnvalueofageneratorthathasn'treturnedin/path/to/php_code.php:x另外,returnempty是一个有效的语法,无论是在PHP7还是之前支持生成器的PHP版本,都会终止生成器继续执行。生成一个空值如果yield后面没有跟任何参数,将返回一个NULL值:NULL[1]=>NULL[2]=>NULL}生成键值对PHP的数组支持关联键值对数组,生成器其实也支持生成键-值对:$i;}}var_dump(iterator_to_array(gen_key_values()));output:array(3){["key0"]=>int(0)["key1"]=>int(1)["key2"]=>int(2)}注入值除了生成值,生成该设备还可以从外部接收值。通过生成器对象的send()方法,我们可以从外部向生成器传递值。这个值将作为yield表达式的结果,我们可以使用这个值来做一些计算或者其他事情,比如根据这个值中止生成器的执行:send('stop');}回声$v。PHP_EOL;}outputresult:0123send()方法的返回值是下一次yield的值,没有则返回NULL。需要注意的是,如果在表达式上下文中使用yield(如上例,在赋值表达式的右侧),则必须使用圆括号将yield声明括起来。例如:$data=(yield$value);以下代码在PHP5中会产生编译错误:$data=yield$value;yieldfromexpressions在PHP7中,使用yieldfromexpressions允许您通过其他生成器、Traversable对象或数组Yields值。这种方法称为生成器委托。以下示例来自官方文档:
