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


Posted in PHP onMarch 16, 2016

本文实例讲述了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 相关文章推荐
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
Oct 12 PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
Apr 09 PHP
CI框架源码阅读,系统常量文件constants.php的配置
Feb 28 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
Jun 17 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
Dec 18 PHP
PHP实现补齐关闭的HTML标签
Mar 22 PHP
CI框架常用方法小结
May 17 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
Jun 12 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
Jul 25 PHP
PHP页面输出搜索后跳转下一页的处理方法
Sep 30 PHP
PHP实现的简单在线计算器功能示例
Aug 02 PHP
PHP扩展安装方法步骤解析
Nov 24 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
Mar 16 #PHP
PHP 中提示undefined index如何解决(多种方法)
Mar 16 #PHP
Laravel中Trait的用法实例详解
Mar 16 #PHP
Laravel中注册Facades的步骤详解
Mar 16 #PHP
PHP与Ajax相结合实现登录验证小Demo
Mar 16 #PHP
Laravel实现构造函数自动依赖注入的方法
Mar 16 #PHP
PHP 二维数组和三维数组的过滤
Mar 16 #PHP
You might like
推荐一篇入门级的Class文章
2007/03/19 PHP
php中get_defined_constants函数用法实例分析
2015/05/12 PHP
PHP生成及获取JSON文件的方法
2016/08/23 PHP
JavaScript实现Sleep函数的代码
2007/03/04 Javascript
js程序中美元符号$是什么
2008/06/05 Javascript
JS 对象介绍
2010/01/20 Javascript
Javascript中的相等与不等运算
2010/04/25 Javascript
文本域光标操作的jQuery扩展分享
2014/03/10 Javascript
javascript使用数组的push方法完成快速排序
2014/09/15 Javascript
js+css实现tab菜单切换效果的方法
2015/01/20 Javascript
js给selected添加options的方法
2015/05/06 Javascript
jQuery实现弹出窗口中切换登录与注册表单
2015/06/05 Javascript
JS实现黑色大气的二级导航菜单效果
2015/09/18 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
2016/10/15 Javascript
浅谈React中组件间抽象
2018/01/27 Javascript
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
Vue + Elementui实现多标签页共存的方法
2019/06/12 Javascript
jquery css实现流程进度条
2020/03/26 jQuery
微信小程序调用wx.getImageInfo遇到的坑解决
2020/05/31 Javascript
Python3 入门教程 简单但比较不错
2009/11/29 Python
Python装饰器(decorator)定义与用法详解
2018/02/09 Python
Windows系统下PhantomJS的安装和基本用法
2018/10/21 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
2018/12/13 Python
对python多线程SSH登录并发脚本详解
2019/02/14 Python
python使用Plotly绘图工具绘制柱状图
2019/04/01 Python
pytorch打印网络结构的实例
2019/08/19 Python
Pytorch evaluation每次运行结果不同的解决
2020/01/02 Python
Python如何急速下载第三方库详解
2020/11/02 Python
土木工程应届生求职信
2013/10/31 职场文书
工地安全检查制度
2014/02/04 职场文书
聘用意向书
2014/07/29 职场文书
4s店活动策划方案
2014/08/25 职场文书
党的群众路线教育实践活动先进个人材料
2014/12/24 职场文书
原告离婚代理词
2015/05/23 职场文书
《牧场之国》教学反思
2016/02/22 职场文书
Python 数据可视化之Matplotlib详解
2021/11/02 Python