什么是生成器生成器生成器允许你在foreach代码块中编写代码来迭代一组数据,而无需在内存中创建数组,这将使你的内存达到上限,或占用相当长的处理时间。相反,您可以编写一个生成器函数,就像普通的自定义函数一样,而不是只返回一次,生成器可以根据需要多次生成需要迭代的值。一个简单的例子是使用生成器重新实现range()函数。标准的range()函数需要在内存中生成一个包含其范围内每个值的数组,然后返回该数组,从而产生多个大数组。例如,调用range(0,10000)会导致超过4MB的内存占用。示例代码=0){thrownewLogicException('Stepmustbe-ve');}for($i=$start;$i>=$limit;$i+=$step){yield$i;}}}if($argc===1){$iterate=rangeWithGenerators(0,$num,1);foreach($iterateas$value){echo$value."\n";}//var_dump(iterator_to_array($iterate));}if($argc===2){$test=range(0,$num,1);foreach($testas$value){echo$value."\n";}}$end=xdebug_memory_usage();echosprintf("内存消耗量%s\n",convert($end-$start));functionconvert($size){$unit=array('b','kb','mb','gb','tb','pb');返回@round($size/pow(1024,($i=floor(log($size,1024)))),2).''.$unit[$i];}环境PHP7.1Xdebug执行命令phptest.php结果返回:内存消耗416bphptest.phprange结果返回:内存消耗4mb测试结果讨论通过代码的执行,除了PHP标准函数rang()和自定义函数rangeWithGenerators()的异同,实现的目的相同,但消耗的内存不同,generators的优势很明显。rangeWithGenerators()使用了一个生成器,生成器的关键是使用yield关键字。yield的常见用法涉及两个流程控制语句,foreach和for。for循环yield变量$iinrangeWithGenerators()(yield可以理解为generated-value,return也可以理解为return-value)。rangeWithGenerators()函数返回一个生成器Generators(使用var_dump($iterate)查看其类型)。由于rangeWithGenerators()函数返回一个生成器,我们可以通过以下两种方式使用它:foreach循环生成器,本例中使用此方法读取生成器。PHP标准函数iterator_to_array(),它将生成器转换为数组。使用场景请参考参考2参考:http://php.net/manual/zh/lang...在实际生产中使用
