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 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
Oct 09 PHP
Ajax PHP分页演示
Jan 02 PHP
PHP获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
Oct 11 PHP
有关PHP中MVC的开发经验分享
May 17 PHP
解析PHP中$_FILES的使用以及注意事项
Jul 05 PHP
thinkphp实现多语言功能(语言包)
Mar 04 PHP
PHP连接MySQL的2种方法小结以及防止乱码
Mar 11 PHP
php中Ctype函数用法详解
Dec 09 PHP
php强制更新图片缓存的方法
Feb 11 PHP
php实现遍历文件夹的方法汇总
Mar 02 PHP
PHP实现简单的模板引擎功能示例
Sep 02 PHP
php实现数组中出现次数超过一半的数字的统计方法
Oct 14 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
计数器详细设计
2006/10/09 PHP
PHP实现的简单mock json脚本分享
2015/02/10 PHP
PHP获取指定时间段之间的 年,月,天,时,分,秒
2016/06/05 PHP
PHP版微信小店接口开发实例
2016/11/12 PHP
CentOS系统中PHP安装扩展的方式汇总
2017/04/09 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
用jscript实现列出安装的软件列表
2007/06/18 Javascript
JQuery优缺点分析说明
2011/04/10 Javascript
jquery next nextAll nextUntil siblings的区别介绍
2013/10/05 Javascript
实例详解angularjs和ajax的结合使用
2015/10/22 Javascript
JavaScript实现刷新不重记的倒计时
2016/08/10 Javascript
JS触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
2016/10/30 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
2017/06/08 jQuery
VUE元素的隐藏和显示(v-show指令)
2017/06/23 Javascript
基于Bootstrap模态对话框只加载一次 remote 数据的解决方法
2017/07/09 Javascript
详解使用angularjs的ng-options时如何设置默认值(初始值)
2017/07/18 Javascript
bootstrap select2插件用ajax来获取和显示数据的实例
2018/08/09 Javascript
Vue+Node实现的商城用户管理功能示例
2019/12/23 Javascript
浅谈Python数据类型判断及列表脚本操作
2016/11/04 Python
在Linux命令行终端中使用python的简单方法(推荐)
2017/01/23 Python
python批量读取txt文件为DataFrame的方法
2018/04/03 Python
python简单实现矩阵的乘,加,转置和逆运算示例
2019/07/10 Python
Python3 批量扫描端口的例子
2019/07/25 Python
python 利用turtle模块画出没有角的方格
2019/11/23 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
2020/02/10 Python
美国面料纺织品商城:Fabric.com
2017/06/28 全球购物
发现世界上最好的珠宝设计师:JewelStreet
2017/12/17 全球购物
StringBuilder和String的区别
2015/05/18 面试题
质检部职责
2013/12/28 职场文书
如何写好建议书
2014/03/13 职场文书
2014领导班子四风问题查摆思想汇报
2014/09/13 职场文书
关于运动会的广播稿
2014/09/22 职场文书
带刀到教室的检讨书
2014/10/04 职场文书
2014年设备管理工作总结
2014/11/26 职场文书
小学生暑假生活总结
2015/07/13 职场文书
2016年清明节网上祭英烈活动总结
2016/04/01 职场文书