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 相关文章推荐
VFP与其他应用程序的集成
Oct 09 PHP
对javascript和select部件的结合运用
Oct 09 PHP
精通php的十大要点(上)
Feb 04 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
Jul 04 PHP
PHP实现异步调用方法研究与分享
Oct 27 PHP
解析Win7 XAMPP apache无法启动的问题
Jun 26 PHP
解析php mysql 事务处理回滚操作(附实例)
Aug 05 PHP
thinkphp实现上一篇与下一篇的方法
Dec 08 PHP
微信公众平台实现获取用户OpenID的方法
Apr 15 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
Nov 04 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
PHP使用curl_multi实现并发请求的方法示例
Apr 29 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
Ha0k 0.3 PHP 网页木马修改版
2009/10/11 PHP
PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
2012/10/05 PHP
解决php接收shell返回的结果中文乱码问题
2014/01/23 PHP
使用CodeIgniter的类库做图片上传
2014/06/12 PHP
PHP实现实时生成并下载超大数据量的EXCEL文件详解
2017/10/23 PHP
Mootools 1.2教程 滑动效果(Slide)
2009/09/15 Javascript
jQuery中与toggleClass等价的程序段 以及未来学习的方向
2010/03/18 Javascript
form表单只提交数据而不进行页面跳转的解决方案
2013/09/18 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
2014/05/11 Javascript
如何使用jQuery技术开发ios风格的页面导航菜单
2015/07/29 Javascript
jQuery获取this当前对象子元素对象的方法
2016/11/29 Javascript
canvas绘制七巧板
2017/02/03 Javascript
实例教学如何写vue插件
2017/11/30 Javascript
微信小程序开发的基本流程步骤
2019/01/31 Javascript
vue实现固定位置显示功能
2019/05/30 Javascript
基于vue手写tree插件的那点事儿
2019/08/20 Javascript
JavaScript 引用类型实例详解【数组、对象、严格模式等】
2020/05/13 Javascript
vue 使用lodash实现对象数组深拷贝操作
2020/09/10 Javascript
Python中文件操作简明介绍
2015/04/13 Python
使用python调用zxing库生成二维码图片详解
2017/01/10 Python
Python中装饰器兼容加括号和不加括号的写法详解
2017/07/05 Python
python实现requests发送/上传多个文件的示例
2018/06/04 Python
Python使用lambda表达式对字典排序操作示例
2019/07/25 Python
python django生成迁移文件的实例
2019/08/31 Python
Python Web静态服务器非堵塞模式实现方法示例
2019/11/21 Python
python入门之基础语法学习笔记
2020/02/08 Python
python微信公众号开发简单流程实现
2020/03/09 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
澳大利亚音乐商店:Bava’s Music City
2019/05/05 全球购物
国际经济贸易专业推荐信
2013/11/06 职场文书
高中生学习生活的自我评价
2013/11/27 职场文书
自考生自我评价分享
2014/01/18 职场文书
2014年个人债务授权委托书范本
2014/09/22 职场文书
2015元旦文艺汇演主持稿(开场白+结束语)
2014/12/14 职场文书
国庆放假通知怎么写
2015/07/30 职场文书
python使用pymysql模块操作MySQL
2021/06/16 Python