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中iconv函数使用方法
May 24 PHP
php 提速工具eAccelerator 配置参数详解
May 16 PHP
php GeoIP的使用教程
Mar 09 PHP
PHP下获取上个月、下个月、本月的日期(strtotime,date)
Feb 02 PHP
19个超实用的PHP代码片段
Mar 14 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
Mar 15 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
Mar 23 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
Jun 15 PHP
基于thinkPHP框架实现留言板的方法
Oct 17 PHP
PDO::getAvailableDrivers讲解
Jan 28 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
Feb 12 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
May 27 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
php通过rmdir删除目录的简单用法
2015/03/18 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
2016/10/14 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
2017/04/26 PHP
11款新鲜的jQuery插件[附所有demo下载]
2011/01/24 Javascript
Js保留小数点的4种效果实现代码分享
2014/04/12 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
2014/05/01 Javascript
推荐25个超炫的jQuery网格插件
2014/11/28 Javascript
JavaScript实现基于Cookie的存储类实例
2015/04/10 Javascript
Jquery实现弹性滑块滑动选择数值插件
2015/08/08 Javascript
你一定会收藏的Nodejs代码片段
2016/02/04 NodeJs
jQuery对象的链式操作用法分析
2016/05/10 Javascript
json实现添加、遍历与删除属性的方法
2016/06/17 Javascript
微信小程序 详解页面跳转与返回并回传数据
2017/02/13 Javascript
使用 Vue.js 仿百度搜索框的实例代码
2017/05/09 Javascript
JS装饰器函数用法总结
2018/04/21 Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
2018/08/12 Javascript
element-ui中的select下拉列表设置默认值方法
2018/08/24 Javascript
angularJs中ng-model-options设置数据同步的方法
2018/09/30 Javascript
Javascript 对象(object)合并操作实例分析
2019/07/30 Javascript
Django中使用celery完成异步任务的示例代码
2018/01/23 Python
Python 删除整个文本中的空格,并实现按行显示
2018/07/24 Python
python使用多进程的实例详解
2018/09/19 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
Python函数基本使用原理详解
2020/03/19 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
QT5 Designer 打不开的问题及解决方法
2020/08/20 Python
介绍一下write命令
2014/08/10 面试题
生物科学专业个人求职信范文
2013/12/05 职场文书
专升本个人自我评价
2013/12/22 职场文书
调查研究项目计划书
2014/04/29 职场文书
员工三分钟演讲稿
2014/08/19 职场文书
辞职信范文大全
2015/03/02 职场文书
业务员管理制度范本
2015/08/06 职场文书
小学生运动会广播
2015/08/19 职场文书
朋友圈早安励志语录!
2019/07/08 职场文书
成人成长感言如何写?
2019/08/16 职场文书