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 地址栏信息的获取代码
Jan 07 PHP
php重定向的三种方法分享
Feb 22 PHP
具有时效性的php加密解密函数代码
Jun 19 PHP
PHP检测字符串是否为UTF8编码的常用方法
Nov 21 PHP
thinkphp数据查询和遍历数组实例
Nov 28 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
Aug 28 PHP
PHP中的随机性 你觉得自己幸运吗?
Jan 22 PHP
PHP Try-catch 语句使用技巧
Feb 28 PHP
php判断是否连接上网络的方法实例详解
Dec 14 PHP
PHP接口继承及接口多继承原理与实现方法详解
Oct 18 PHP
thinkphp5 URL和路由的功能详解与实例
Dec 26 PHP
phpQuery解析HTML乱码问题(补充官网未列出的乱码解决方案)
Apr 01 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使用Jpgraph创建折线图效果示例
2017/02/15 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
php实现websocket实时消息推送
2018/03/30 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
jquery.ui.draggable中文文档
2009/11/24 Javascript
基于jquery的动态创建表格的插件
2011/04/05 Javascript
jQuery 联动日历实现代码
2012/05/31 Javascript
javascript中常用编程知识
2013/04/08 Javascript
你必须知道的JavaScript 变量命名规则详解
2013/05/07 Javascript
浅析LigerUi开发中谨慎载入common.css文件
2013/07/09 Javascript
js取两个数组的交集|差集|并集|补集|去重示例代码
2013/08/07 Javascript
使用requestAnimationFrame实现js动画性能好
2015/08/06 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
原生js封装的ajax方法示例
2018/08/02 Javascript
解决Layui数据表格中checkbox位置不居中的方法
2018/08/15 Javascript
python学习笔记:字典的使用示例详解
2014/06/13 Python
python动态网页批量爬取
2016/02/14 Python
python异常和文件处理机制详解
2016/07/19 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
windows下python安装小白入门教程
2018/09/18 Python
如何使用Python抓取网页tag操作
2020/02/14 Python
Pycharm如何运行.py文件的方法步骤
2020/03/03 Python
详解python中groupby函数通俗易懂
2020/05/14 Python
Python中的xlrd模块使用原理解析
2020/05/21 Python
解决tensorflow读取本地MNITS_data失败的原因
2020/06/22 Python
Python OpenCV去除字母后面的杂线操作
2020/07/05 Python
Python下载网易云歌单歌曲的示例代码
2020/08/12 Python
jupyter notebook指定启动目录的方法
2021/03/02 Python
css3旋转木马_动力节点Java学院整理
2017/07/12 HTML / CSS
Html5页面上如何禁止手机虚拟键盘弹出
2020/03/19 HTML / CSS
运动服饰每月订阅盒:Ellie
2018/04/29 全球购物
2014年小学德育工作总结
2014/12/05 职场文书
2016年社区党支部公开承诺书
2016/03/25 职场文书
JavaScript实现登录窗体
2021/06/22 Javascript