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
Oct 09 PHP
ThinkPHP 连接Oracle数据库的详细教程[全]
Jul 16 PHP
php中调用其他系统http接口的方法说明
Feb 28 PHP
ThinkPHP连接数据库及主从数据库的设置教程
Aug 22 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
Mar 16 PHP
PHP微信刮刮卡 附微信接口
Jul 22 PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
Jan 11 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
Apr 09 PHP
php生成网页桌面快捷方式
May 05 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 PHP
PHP使用函数用法详解
Sep 30 PHP
laravel-admin的多级联动方法
Sep 30 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
30个最佳jQuery Lightbox效果插件分享
2011/04/11 Javascript
jquery设置元素的readonly和disabled的写法
2013/09/22 Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
2014/06/06 Javascript
JavaScript中数组成员的添加、删除介绍
2014/12/30 Javascript
正则表达式优化JSON字符串的技巧
2015/12/24 Javascript
jQuery插件实现文字无缝向上滚动效果代码
2016/02/25 Javascript
AngularJS入门教程之AngularJS表达式
2016/04/18 Javascript
Javascript自执行匿名函数(function() { })()的原理浅析
2016/05/15 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
JS数组去重常用方法实例小结【4种方法】
2018/05/28 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
深入理解Puppeteer的入门教程和实践
2019/03/05 Javascript
详解如何写出一个利于扩展的vue路由配置
2019/05/16 Javascript
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
2019/11/13 Javascript
JavaScript对象属性操作实例解析
2020/02/04 Javascript
v-slot和slot、slot-scope之间相互替换实例
2020/09/04 Javascript
Flask框架学习笔记之消息提示与异常处理操作详解
2019/08/15 Python
python如何将两个txt文件内容合并
2019/10/18 Python
python爬虫之遍历单个域名
2019/11/20 Python
基于Numba提高python运行效率过程解析
2020/03/02 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
Nike台湾官方商店:Nike.com (TW)
2017/08/16 全球购物
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
会计专业毕业自荐书范文
2014/02/08 职场文书
推荐信怎么写
2014/05/09 职场文书
毕业生学校推荐信范文
2014/05/21 职场文书
酒店管理专业自荐信
2014/05/23 职场文书
交通安全标语
2014/06/06 职场文书
聘用意向书
2014/07/29 职场文书
青年标兵事迹材料
2014/08/16 职场文书
英文导游词
2015/02/13 职场文书
高一语文教学反思
2016/02/16 职场文书
管理者日常工作必备:22条企业管理流程模板!
2019/07/12 职场文书
基于angular实现树形二级表格
2021/10/16 Javascript
Python实现文字pdf转换图片pdf效果
2022/04/03 Python