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代码简化
Feb 08 PHP
IP攻击升级,程序改进以对付新的攻击
Nov 23 PHP
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
Jul 03 PHP
深入密码加salt原理的分析
Jun 06 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
Jul 12 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
Aug 21 PHP
PHP 验证登陆类分享
Mar 13 PHP
详解PHP序列化反序列化的方法
Oct 27 PHP
PHP静态成员变量
Feb 14 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 PHP
Yii框架常见缓存应用实例小结
Sep 09 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
Dec 16 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
vBulletin Forum 2.3.xx SQL Injection
2006/10/09 PHP
PHP Curl多线程原理实例详解
2013/11/06 PHP
php实现在线生成条形码示例分享(条形码生成器)
2013/12/30 PHP
PHP实现通过CURL上传文件功能示例
2018/05/30 PHP
基于jquery的checkbox下拉框插件代码
2010/06/25 Javascript
javascript阻止scroll事件多次执行的思路及实现
2013/11/08 Javascript
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
2014/06/23 Javascript
D3.js中data(), enter() 和 exit()的问题详解
2015/08/17 Javascript
一个php+js实时显示时间问题
2015/10/12 Javascript
AngularJS开发教程之控制器之间的通信方法分析
2016/12/25 Javascript
javascript history对象详解
2017/02/09 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
微信小程序实现MUI数字输入框效果
2018/01/31 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
微信小程序下拉框组件使用方法详解
2018/12/28 Javascript
解决微信小程序调用moveToLocation失效问题【超简单】
2019/04/12 Javascript
微信小程序页面传多个参数跳转页面的实现方法
2019/05/17 Javascript
vuejs中父子组件之间通信方法实例详解
2020/01/17 Javascript
[42:25]EG vs Spirit Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
深入理解Python中的元类(metaclass)
2015/02/14 Python
编写Python脚本来获取mp3文件tag信息的教程
2015/05/04 Python
Python实现mysql数据库更新表数据接口的功能
2017/11/19 Python
vscode 远程调试python的方法
2017/12/01 Python
在NumPy中创建空数组/矩阵的方法
2018/06/15 Python
使用Python自动生成HTML的方法示例
2019/08/06 Python
python实现监控阿里云账户余额功能
2019/12/16 Python
tensorflow pb to tflite 精度下降详解
2020/05/25 Python
挪威太阳镜和眼镜网上商城:SmartBuyGlasses挪威
2016/08/20 全球购物
英国最大的正宗复古足球衫制造商和零售商:TOFFS
2018/06/21 全球购物
印尼最大的网上书店:Gramedia.com
2018/09/13 全球购物
美国家居用品和厨具购物网站:DealsDot
2019/10/07 全球购物
服务行业口号
2014/06/11 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书
mysql批量新增和存储的方法实例
2021/04/07 MySQL
基于Redis过期事件实现订单超时取消
2021/05/08 Redis