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水印
Mar 16 PHP
解析PayPal支付接口的PHP开发方式
Nov 28 PHP
php中获取关键词及所属来源搜索引擎名称的代码
Feb 15 PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
Sep 04 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
Jun 20 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
Jun 26 PHP
PHP将HTML转换成文本的实现代码
Jan 21 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
Aug 17 PHP
php将html转为图片的实现方法
May 19 PHP
PHP基于timestamp和nonce实现的防止重放攻击方案分析
Jul 26 PHP
在Laravel中实现使用AJAX动态刷新部分页面
Oct 15 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 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函数篇详解十进制、二进制、八进制和十六进制转换函数说明
2011/12/05 PHP
php中的静态变量的基本用法
2014/03/20 PHP
采用ThinkPHP中F方法实现快速缓存实例
2014/06/13 PHP
jQuery 数据缓存data(name, value)详解及实现
2010/01/04 Javascript
Jquery ui css framework
2010/06/28 Javascript
使用C++为node.js写扩展模块
2015/04/22 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
前端设计师们最常用的JS代码汇总
2016/09/25 Javascript
3种不同的ContextMenu右键菜单实现代码
2016/11/03 Javascript
BootStrap表单验证实例代码
2017/01/13 Javascript
详解Vue路由开启keep-alive时的注意点
2017/06/20 Javascript
Vue.js分页组件实现:diVuePagination的使用详解
2018/01/10 Javascript
AngularJS日期格式化常见操作实例分析
2018/05/17 Javascript
详解vue-cli官方脚手架配置
2018/07/20 Javascript
element ui 表格动态列显示空白bug 修复方法
2018/09/04 Javascript
使用JQuery自动完成插件Auto Complete详解
2019/06/18 jQuery
原生JS实现留言板功能
2020/02/08 Javascript
js实现手表表盘时钟与圆周运动
2020/09/18 Javascript
Python实现HTTP协议下的文件下载方法总结
2016/04/20 Python
PyCharm使用教程之搭建Python开发环境
2016/06/07 Python
Python、PyCharm安装及使用方法(Mac版)详解
2017/04/28 Python
浅谈python函数之作用域(python3.5)
2017/10/27 Python
Python面向对象类继承和组合实例分析
2018/05/28 Python
python读写csv文件的方法
2019/08/13 Python
基于Python下载网络图片方法汇总代码实例
2020/06/24 Python
Python pickle模块常用方法代码实例
2020/10/10 Python
scrapy在python爬虫中搭建出错的解决方法
2020/11/22 Python
倩碧英国官网:Clinique英国
2018/08/10 全球购物
成品仓管员岗位职责
2013/12/11 职场文书
高三地理教学反思
2014/01/11 职场文书
考试作弊检讨书大全
2014/02/18 职场文书
干部职工纪律作风整改措施思想汇报
2014/10/11 职场文书
酒店工程部岗位职责
2015/02/12 职场文书
财政局长个人总结
2015/03/04 职场文书
毕业生入职感言
2015/07/31 职场文书
Node与Python 双向通信的实现代码
2021/07/16 Javascript