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

 更新时间:2016年03月16日 11:09:17   作者:小谈博客  
这篇文章主要介绍了PHP5.5迭代生成器用法,结合实例形式详细分析了PHP5.5迭代生成器的功能,定义及相关使用技巧,需要的朋友可以参考下

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

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

<?php
function xrange($start, $end, $step = 1) {
    for ($i = $start; $i <= $end; $i += $step) {
      yield $i;
    }
}
foreach (xrange(1, 1000000) as $num) {
    echo $num, "\n";
}

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

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

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

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

再看看PHP官网的例子:

<?php
function xrange($start, $limit, $step = 1) {
  for ($i = $start; $i <= $limit; $i += $step) {
    yield $i;
  }
}
echo 'Single digit odd numbers: ';
/*
 * Note that an array is never created or returned,
 * which saves memory.
 */
foreach (xrange(1, 9, 2) as $number) {
  echo "$number ";
}
echo "\n";
?>

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

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

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php操作office文档技巧总结(包括word,excel,access,ppt)》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

希望本文所述对大家PHP程序设计有所帮助。

相关文章

  • php的日期处理函数及uchome的function_coomon中日期处理函数的研究

    php的日期处理函数及uchome的function_coomon中日期处理函数的研究

    经常在用php的时候会碰到一个关于时间日期的问题还有时区差异的问题,以前作项目的时候会把时间搞错,要么就是提前八小时了,要么那个时间就是驴唇不对马嘴的,现在我就来深入研究一下这里面的各个函数及其用法
    2011-01-01
  • php 接口类与抽象类的实际作用

    php 接口类与抽象类的实际作用

    很多人搞不清楚接口和抽象类的区别!下面我把我的理解与大家共享!
    2009-11-11
  • php JWT在web端中的使用方法教程

    php JWT在web端中的使用方法教程

    这篇文章主要给大家介绍了关于php JWT在web端中的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • 深入解析PHP中SESSION反序列化机制

    深入解析PHP中SESSION反序列化机制

    这篇文章主要介绍了PHP中SESSION反序列化机制的相关资料,文中介绍的非常相信,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-03-03
  • PHP中防SQL注入的主要方法

    PHP中防SQL注入的主要方法

    PHP中防止SQL注入的主要方法旨在确保用户输入被安全地处理,从而防止攻击者通过SQL注入漏洞来操纵数据库,本文给大家介绍了PHP中防SQL注入的主要方法,需要的朋友可以参考下
    2024-10-10
  • php处理单文件、多文件上传代码分享

    php处理单文件、多文件上传代码分享

    这篇文章主要为大家详细介绍了php处理单文件、多文件上传代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • php使用get_class_methods()函数获取分类的方法

    php使用get_class_methods()函数获取分类的方法

    这篇文章主要介绍了php使用get_class_methods()函数获取分类的方法,结合实例形式分析了get_class_methods()函数获取类中成员方法的使用技巧,需要的朋友可以参考下
    2016-07-07
  • PHP实现重载的常用方法实例详解

    PHP实现重载的常用方法实例详解

    这篇文章主要介绍了PHP实现重载的常用方法,结合实例形式对比java分析了php实现重载的四种常见实现技巧,需要的朋友可以参考下
    2017-10-10
  • PHP实现递归无限级分类

    PHP实现递归无限级分类

    这篇文章主要介绍了PHP实现递归无限级分类的方法,具有一定的参考价值,需要的朋友可以参考下
    2015-10-10
  • PHP实现上传多图即时显示与即时删除的方法

    PHP实现上传多图即时显示与即时删除的方法

    这篇文章主要介绍了PHP实现上传多图即时显示与即时删除的方法,结合实例形式分析了php针对图片文件的预览、上传及删除相关操作技巧,需要的朋友可以参考下
    2017-05-05

最新评论