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脚本的10个技巧(7)
Oct 09 PHP
了解Joomla 这款来自国外的php网站管理系统
Mar 11 PHP
深入密码加salt原理的分析
Jun 06 PHP
实测在class的function中include的文件中非php的global全局环境
Jul 15 PHP
采用header定义为文件然后readfile下载(隐藏下载地址)
Jan 31 PHP
PHP使用GIFEncoder类处理gif图片实例
Jul 01 PHP
ThinkPHP模型详解
Jul 27 PHP
php安装ssh2扩展的方法【Linux平台】
Jul 20 PHP
PHP实现的常规正则验证helper公共类完整实例
Apr 27 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 PHP
PHP生成短网址的思路以及实现方法的详解
Mar 25 PHP
php基于 swoole 实现的异步处理任务功能示例
Aug 13 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
咖啡语言
2021/03/03 咖啡文化
浅析linux下apache服务器的配置和管理
2013/08/10 PHP
PHP获取客户端真实IP地址的5种情况分析和实现代码
2014/07/08 PHP
PHP下的Oracle客户端扩展(OCI8)安装教程
2014/09/10 PHP
typecho插件编写教程(二):写一个新插件
2015/05/28 PHP
PHP实现批量清空删除指定文件夹所有内容的方法
2017/05/30 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
2010/03/12 Javascript
基于jQuery实现的水平和垂直居中的div窗口
2011/08/08 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
jquery 设置元素相对于另一个元素的top值(实例代码)
2013/11/06 Javascript
js类定义函数时用prototype与不用的区别示例介绍
2014/06/10 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
2015/04/20 Javascript
完美JQuery图片切换效果的简单实现
2016/07/21 Javascript
jQuery EasyUI datagrid在翻页以后仍能记录被选中行的实现代码
2016/08/15 Javascript
js实现常见的工具条效果
2017/03/02 Javascript
JS数组操作中的经典算法实例讲解
2017/07/26 Javascript
微信小程序实现顶部选项卡(swiper)
2020/06/19 Javascript
[js高手之路]原型式继承与寄生式继承详解
2017/08/28 Javascript
js 概率计算(简单版)
2017/09/12 Javascript
js中json对象和字符串的理解及相互转化操作实现方法
2017/09/22 Javascript
基于React+Redux的SSR实现方法
2018/07/03 Javascript
Vue头像处理方案小结
2018/07/26 Javascript
JavaScript基础教程之如何实现一个简单的promise
2018/09/11 Javascript
如何使用vuex实现兄弟组件通信
2018/11/02 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
[02:17]TI4西雅图DOTA2前线报道 啸天mik夫妻档解说
2014/07/08 DOTA
Python进阶_关于命名空间与作用域(详解)
2017/05/29 Python
python引入导入自定义模块和外部文件的实例
2017/07/24 Python
美国最大网上鞋店:Zappos
2016/07/25 全球购物
美国著名首饰网站:BaubleBar
2016/08/29 全球购物
私用公车造成事故检讨书
2014/11/16 职场文书
护士长2015年终工作总结
2015/04/24 职场文书
暂住证明怎么写
2015/06/19 职场文书
保护环境建议书作文500字
2015/09/14 职场文书
Python requests用法和django后台处理详解
2022/03/19 Python