当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP5.5迭代生成器用法实例详解

发布:smiling 来源: PHP粉丝网  添加日期:2019-11-17 18:32:07 浏览: 评论:0 

本文实例讲述了PHP5.5迭代生成器用法。分享给大家供大家参考,具体如下:

PHP5.5引入了迭代生成器的概念,迭代的概念早就在PHP有了,但是迭代生成器是PHP的一个新特性,这跟python3中的迭代生成器类似,看看PHP5.5的迭代生成器如何定义。

  1. function xrange($start$end$step = 1) { 
  2.  
  3.     for ($i = $start$i <= $end$i += $step) { 
  4.  
  5.       yield $i
  6.  
  7.     } 
  8. //phpfensi.com 
  9.  
  10. foreach (xrange(1, 1000000) as $num) { 
  11.  
  12.     echo $num"\n"
  13.  

注意关键字:yield,正是这个yeild关键字构建了一个迭代器,这个函数xrange跟以往的函数的不同之处就在这里。一般情况都是return一个值,而yield一个值就表示这是个迭代器,每循环一次这个迭代器就生成这个值,故名为迭代生成器,迭代生成器这个函数可以进行foreach循环,每次都产生一个值。

PHP5.5之前是通过定义类实现Iterator接口的方式来构造迭代器,通过yield构造迭代器将更加提升性能节省系统开销。

这种方法的优点是显而易见的.它可以让你在处理大数据集合的时候不用一次性的加载到内存中,甚至你可以处理无限大的数据流。

如上面例子所示,这个迭代器的功能是生成从1到1000000的数字,循环输出,那么使用以往的方式是生成好这1到1000000的数字到数组中,将会十分占用内存,因为是事先就要生成好所有结果,而不是用的时候按需生成,也就是说调用xrange这个迭代器的时候,里面的函数还没有真正的运行,直到你每一次的迭代。

再看看PHP官网的例子:

  1. function xrange($start$limit$step = 1) { 
  2.  
  3.   for ($i = $start$i <= $limit$i += $step) { 
  4.  
  5.     yield $i
  6.  
  7.   } 
  8.  
  9.  
  10. echo 'Single digit odd numbers: '
  11.  
  12. /* 
  13.  
  14.  * Note that an array is never created or returned, 
  15.  
  16.  * which saves memory. 
  17.  
  18.  */ 
  19.  
  20. foreach (xrange(1, 9, 2) as $number) { 
  21.  
  22.   echo "$number "
  23.  
  24.  
  25. echo "\n"

这里的xrange是一个迭代,功能和range是一样的,如果使用range函数的话,那么函数内部实现会储存每个迭代的中间过程,即每个中间变量都有 个内存空间,那么首先程序使用的内存空间就大了,而且分配内存,回收内存都会导致程序的运行时间加长。但是如果使用上yield实现的xrange函数的 话,里面所有的中间变量都只使用一个内存$i,这样节省的时间和空间都会变小。

那么为什么yield会有这样的效果呢?联想到lua中的yield,这里就算是协程的概念了。在lua语言中,当程序运行到yield的时候,使用协程 将上下文环境记录住,然后将程序操作权归还到主函数,当主函数调用resume的时候,会重新唤起协程,读取yield记录的上下文。这样形成了程序语言 级别的多协程操作。php 5.5这里的yield也是同样的道理,当程序运行到yield的时候,当前程序就唤起协程记录上下文,然后主函数继续操作,只是php中没有使用如 resume一样的关键字,而是“在使用的时候唤起”协程。比如上例中的foreach迭代器就能唤起yield。所以上面的这个例子就能理解了。

Tags: PHP5 5迭代 生成器

分享到: