当前位置: 首页 > 后端技术 > PHP

【现代PHP专题(七)】生成器语法

时间:2023-03-29 14:24:09 PHP

通常,当你迭代一组数据时,你需要创建一个数据。如果数组很大,会非常消耗性能,甚至会导致内存不足。//致命错误:允许的1073741824字节的内存大小已耗尽(尝试分配32字节)range(1,100000000);PHP5.5实现了generator,每当生成数组元素时,返回yield关键字并执行函数Pause,当函数next方法执行时,会从上次yield的位置继续执行。在下面的例子中,只会生成中间变量$i,并且只会在每个循环中赋值;functionxrange($start,$limit,$step=1){for($i=$start;$i<=$limit;$i+=$step){//注意变量$i的值为在不同的产量之间保持传递。收益$i;}}$generator=xrange(1,100000000,1);//可以通过foreach获取;foreach($generatoras$number){echo"$number";echoPHP_EOL;}//由于生成器实际上是一个实现迭代器接口的类,所以也可以通过相关的迭代器方法进行迭代//var_dump($generator)classGenerator#1(0){}//生成器实现迭代器{}$generator->rewind();while($generator->valid()){echo$generator->current();}echoPHP_EOL;$generator->next();}生成器函数的核心是yield关键字。它最简单的调用形式看起来像一个return语句,不同之处在于正常的return返回一个值并终止函数的执行,而yield返回一个值给循环遍历生成器的代码并简单地暂停生成器函数的执行。通过生成器生成关联数组/**下面每一行都是用分号分隔的字段组合,第一个字段会作为键名。*/$input=<<<'EOF'1;PHP;喜欢符号2;Python;喜欢空格3;Ruby;喜欢blocksEOF;functioninput_parser($input){foreach(explode("\n",$input)as$行){$fields=explode(';',$line);$id=array_shift($fields);产量$id=>$fields;}}foreach(input_parser($input)as$id=>$fields){echo"$id:\n";回声“$字段[0]\n”;echo"$fields[1]\n";}/*1:PHP喜欢符号2:Python喜欢空白3:Ruby喜欢块*/生成NULL值咯;使用引用生成值首先了解一下从函数返回引用的概念手册解释:当你想使用一个函数来查找引用应该绑定到哪个变量时,使用引用返回。不要使用返回引用来提高性能,引擎足够聪明,可以自我优化。仅在有充分的技术理由时才返回引用!要返回引用,请使用以下语法:示例:使用返回引用类foo{public$value=42;publicfunction&getValue(){返回$this->value;}}$obj=newfoo;//$myValue是对$obj->value的引用,也就是42.//$myValue是对$obj->value的引用,它们的值都是42$myValue=&$obj->getValue();//对$obj->value重新赋值会影响$myValue的值$obj->value=2;//打印$obj->value的新值,即2.回声$我的价值;//程序输出2Example:notusedreturnreferenceclassfoo{public$value=42;publicfunctiongetValue(){return$this->value;}}$obj=newfoo;$myValue=$obj->getValue();$obj->value=2;echo$obj->值;//输出2echo$myValue;//输出42,因为返回的是当前值的副本;&getValue()函数将引用绑定到成员变量$value。通常,$obj=newfoo;$obj生成的$obj是一个副本,其成员变量$value与函数getValue()没有“别名”(引用)关系。示例:通过引用生成一个值function&gen_reference(){$value=3;while($value>0){yield$value;}}/**我们可以在循环中修改$number的值,生成器是使用gen_reference()的引用值生成的,所以gen_reference()里面的$value值也会随之变化。*/foreach(gen_reference()as&$number){echo(--$number).'...';//改变的是gen_reference()中的$value值;这样里面的循环就不是死循环了。}yieldfrom关键字在PHP7版本中,生成器允许其他生成器、可迭代对象或数组通过yieldfrom关键字生成相应的值;函数count_to_ten(){yield1;产量2;从[3,4]产生;yieldfromnewArrayIterator([5,6]);从seven_eight()产生;产量9;产量10;}functionseven_eight(){产量7;yieldfromeight();}functioneight(){yield8;}foreach(count_to_ten()as$num){echo"$num";}//输出12345678910