PHP 5.5 增加了个新的关键字 yield,这个也是本人今天在看开源应用 tencent-php tsf 的源码的时候发现的,其中大量的使用到了 yield。

通俗一点的讲,yield 是 generator 发生器,配合迭代 iterator 使用。在函数迭代的某一步遇到 yield 语句时返回一个值,下次生成时从 yield 语句的地方继续运行,直到再次遇到 yield 再次返回值,这样就可以达到更好的迭代 iterate 的效果。

看官方文档上有个例子讲到了将 range() 实现为生成器,当数据量很大的时候不会消耗太多内存,代码示例如下:<?php

function xrange($start, $limit, $step = 1) {

if ($start < $limit) {

if ($step <= 0) {

throw new LogicException('Step must be +ve');

}

for ($i = $start; $i <= $limit; $i += $step) {

yield $i;

}

} else {

if ($step >= 0) {

throw new LogicException('Step must be -ve');

}

for ($i = $start; $i >= $limit; $i += $step) {

yield $i;

}

}

}

?>

yield 关键字语法返回生成器对象。当一个生成器函数第一次被调用的时候,会返回一个内部 Generator 类的对象。这个对象和一个只能向前的迭代器对象一样实现了 Iterator 接口。大部分 Generator 类中的方法拥有和 Iterator 接口一样的语义,但是生成器对象有一个特殊的方法: send()。<?php

class Generator implements Iterator {

public function rewind(); // 返回到迭代器的第一个元素。

public function valid(); // 返回false如果迭代器已经关闭,否则返回true

public function current(); // 返回当前yield值.

public function key(); // 返回当前yield键名.

public function next(); // 恢复生成器的执行。

public function send($value); // 将传入的值作为yield表达式的结果并且恢复发生器的执行。

}

?>

yield 的应用场景,一般多用于循环体,比如数据库的 fetch 操作,这样可以减少内存的消耗,ZanPHP 框架就大量的这样使用。切莫滥用 yield 操作,滥用的结果性能会降低。

php yield mysql_PHP 5.5 新特性关键字 yield相关推荐

  1. php yield 个人小解_PHP5.5新特性之yield理解与用法实例分析

    本文实例讲述了PHP5.5新特性之yield理解与用法.分享给大家供大家参考,具体如下: yield生成器是php5.5之后出现的,yield提供了一种更容易的方法来实现简单的迭代对象,相比较定义类实 ...

  2. ios开发ios9新特性关键字学习:泛型,逆变,协变,__kindof

    一:如何去学习?都去学习什么? 1:学习优秀项目的设计思想,多问几个为什么,为什么要这么设计,这么设计的好处是什么,还能不能在优化 ,如何应用到自己的项目中 2:学习优秀项目的代码风格,代码的封装设计 ...

  3. python中yield语句的作用_Python中关键字yield有什么作用

    python中,yield关键字的作用:1.将一个函数修改为生成器,利用生成器可以有效地节约系统资源,避免不必要的内存占用:2.用于定义上下文管理器:3.协程:4.配合from形成yield from ...

  4. Java 12 switch表达式新特性(->,yield)

    switch表达式 使用switch时,如果遗漏了break,就会造成严重的逻辑错误,而且不易在源代码中发现错误.从Java 12开始,switch语句升级为更简洁的表达式语法,使用类似模式匹配(Pa ...

  5. C++11 新特性 —— 关键字noexcept

    转载;https://www.cnblogs.com/sword03/p/10020344.html 1 关键字noexcept 从C++11开始,我们能看到很多代码当中都有关键字noexcept.比 ...

  6. ES6新特性----面试

    ES6新特性 关键字 let关键字 const关键字 解构赋值 变量的解构赋值 数组的解构赋值 对象的解构赋值 字符串的解构赋值 数值和布尔值的解构赋值 函数参数的解构赋值 用途 模板字符串 箭头函数 ...

  7. php7.0 yield,PHP7中生成器的新特性 yield-from amp;amp; return-values

    生成器委托 简单地翻译官方文档的描述: PHP7中,通过生成器委托(yield from),可以将其他生成器.可迭代的对象.数组委托给外层生成器.外层的生成器会先顺序 yield 委托出来的值,然后继 ...

  8. SQL Server 2005新特性之使用with关键字解决递归父子关系

    1. 引言 现实项目中经常遇到需要处理递归父子关系的问题,如果把层次关系分开,放在多个表里通过主外键关系联接,最明显的问题就是扩展起来不方便,对于这种情况,一般我们会创建一个使用自连接的表来存放数据. ...

  9. C++11新特性之auto关键字的使用

    一.auto关键字简介 auto这个关键字并不是一个全新的关键字,在旧标准中,它代表的是"具有自动存储期的局部变量":但是它在这方面并没有起到很大的作用,比如:auto int i ...

最新文章

  1. 笑傲江湖ol更新服务器正在维护,笑傲江湖ol4月22日更新内容 调整死亡复活设置...
  2. 我对观察者模式的理解,之前一直很乱
  3. 最近微信方面的更新   getUserInfo:fail scope unauthorized
  4. MyBatis 源码自我解读
  5. 【调研】在总体为n的情况下,多少样本有代表性?
  6. 433MHz LoRa/FSK 无线频谱波形分析(频谱分析仪测试LoRa/FSK带宽、功率、频率误差等)
  7. 计算机控制plc应用论文,PLC自动控制系系统在变频器中的运用
  8. Caused by: org.apache.thrift.TApplicationException: Required field ‘filesAdded‘ is unset
  9. 关于硬盘分区(主分区、扩展分区和逻辑分区)
  10. [Luogu P3613] 睡觉困难综合征
  11. Apsara Clouder基础技能认证:阿里巴巴编码规范
  12. 人的大脑就是量子计算机吧,新发现!人类大脑其实就是台量子电脑
  13. 如何输入带空格的字符串
  14. 画出传输门、三态门、开路门_(整理)第2章 门电路
  15. 判断素数(java语言编写)
  16. 用 Python 一键生成QQ个人报告
  17. java项目-第94期基于ssm的在线答题系统-计算机毕业设计
  18. 图书馆管理系统(tomcat,w3c,servlet)
  19. 二郎学习之旅之基本数据结构
  20. 诠释韧性增长,知乎Q3财报里的社区优势和商业化价值

热门文章

  1. Angular:why click add button does not work for the second time
  2. 如何给IP Product找到可用的sales organization
  3. workflow and email in QD3 - IS_INBOX_USER method
  4. SAP Cloud for Customer interaction center 呼叫中心集成
  5. Java Swagger的注释类是怎么被调用到的
  6. SAP CRM Fiori my task应用是如何在My Account应用里加载的
  7. 大数据的说法 正确的是_前端测试题:(解析)用于播放音频文件的正确HTML5元素是?...
  8. oracle获取序列跳号,Oracle sequence跳号知多少
  9. python缩进符错误_python – 如何修复Pylint“错误的缩进”和PEP8 E121?
  10. mysql数据库的分离_数据库分离和附加 (SQL Server)