php中关于 yield 关键字的介绍[点击查看]

<?php
function gen_one_to_three() {
for ($i = 1; $i <= 3; $i++) {
//注意变量$i的值在不同的yield之间是保持传递的。
yield $i;
}
}

官方上的例子, 可以理解为, 调用 yield $i 时, yield 向生成器返回 $i 的值, 官方上的输出也是容易理解的, 如果稍作修改:

<?php

function gen_one_to_three() {
for ($i = 1; $i <= 3; $i++) {
//注意变量$i的值在不同的yield之间是保持传递的。
$val = (yield $i);
echo $val;
}
} $generator = gen_one_to_three();
foreach ($generator as $value) {
echo "$value\n";
}

这样, 结果与官方的会有什么不同? 标红的 $val 会不会有输出? 带着这些疑问运行以后, 结果与官方例子的输出结果是一样的.

这里的 yield 会返回一个值给生成器; 当然 $val = (yield $i) 这种写法, 也是支持的, 只不过 $val 不是 $i, 而是会接收 send 过来的一个值[见这里]

先来看一段代码:

<?php

function gen()
{
$ret = (yield 'yield1');
var_dump($ret);
$ret = (yield 'yield2');
var_dump($ret);
} $gen = gen(); // foreach ($gen as $key => $val) {
// var_dump($val);
// } var_dump($gen->current());// 输出内容为: string(6) "yield1"
var_dump($gen->send('hello first send')); // 这里会有两行输出, 分别为 string(16) "hello first send"  与 string(6) "yield2"

var_dump($gen->send('hello senond send')); // 这里同样会有两行输出, 分别为 string(17) "hello senond send" 与 NULL

代码引自 在PHP中使用协程实现多任务调度 , 有改动.

看着输出的结果, 如果刚接触 yield, 或是对生成器机制不了解, 会不会有些懞圈.

对于 current 的输出, 好理解, 就是返回当前产生的值[看这里].

对于第一个 send, 输出  hello first send, 也好理解, 上面已经说过, 代码里的第一个 $ret 会接收 send 的值, 并 var_dump 出来; 对于输出的第二行  yield2, 其实就是 $ret = (yield 'yield2'); 这一行返回到生成器中的结果, 因为程序执行中, 遇到了 yield, 会返回一个值给生成器, 并且暂停执行生成器函数. 这里的 send, 相当于生成器给我们提供一个接口来  inject (注入).

注: 以上只是个人对 yield 的理解, 记下来并作以后查看, 如有错误, 希望大神指出. 谢谢.

php yield的更多相关文章

  1. Python 生成器与迭代器 yield 案例分析

    前几天刚开始看 Python ,后因为项目突然到来,导致Python的学习搁置了几天.然后今天看回Python 发现 Yield 这个忽然想不起是干嘛用的了(所以,好记性不如烂笔头.).然后只能 花点 ...

  2. node 异步回调解决方法之yield

    先看如何使用 使用的npm包为genny,npm 安装genny,使用 node -harmony 文件(-harmony 为使用es6属性启动参数) 启动项目 var genny= require( ...

  3. yield生成器及字符串的格式化

    一.生成器 def ran(): print('Hello world') yield 'F1' print('Hey there!') yield 'F2' print('goodbye') yie ...

  4. Python中的生成器与yield

    对于python中的yield有些疑惑,然后在StackOverflow上看到了一篇回答,所以搬运过来了,英文好的直接看原文吧. 可迭代对象 当你创建一个列表的时候,你可以一个接一个地读取其中的项.一 ...

  5. Python yield函数理解

    Python中的yield函数的作用就相当于一个挂起,是不被写入内存的,相当于一个挂起的状态,用的时候迭代,不用的时候就是一个挂起状态,挂起状态会以生成器的状态表现

  6. ecma6 yield

    function * generator(k){ console.log('begin'); var x = yield k; console.log('x:',x); var y = yield x ...

  7. Python yield与实现

    Python yield与实现  yield的功能类似于return,但是不同之处在于它返回的是生成器. 生成器 生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭 ...

  8. 可惜Java中没有yield return

    项目中一个消息推送需求,推送的用户数几百万,用户清单很简单就是一个txt文件,是由hadoop计算出来的.格式大概如下: uid caller 123456 12345678901 789101 12 ...

  9. 使用yield进行异步流程控制

    现状 目前我们对异步回调的解决方案有这么几种:回调,deferred/promise和事件触发.回调的方式自不必说,需要硬编码调用,而且有可能会出现复杂的嵌套关系,造成"回调黑洞" ...

  10. GetEnumerator();yield

    GetEnumerator()方法的实质实现: 说明:只要一个集合点出GetEnumerator方法,就获得了迭代器属性,就可以用MoveNext和Current来实现foreach的效果,如上图. ...

随机推荐

  1. Django 安全策略的 7 条总结!

    Florian Apolloner 发言主题为 Django 安全,其中并未讨论针对 SSL 协议的攻击--因为那不在 Django 涉及范围内.(如感兴趣可参考 https://www.ssllab ...

  2. Python3整理文件

    晚上打算把播放器下载下来的音乐拷贝到mp3里边,但是它是如下形式存放的,相当头痛…… 作为程序员,想到使用python来遍历这个目录,并将有大于限制的音乐文件拷贝到指定目录,相关实现代码如下: # a ...

  3. Tomcat J2ee 发布步骤

    1.找到要发布的工程,并发布到本地tomcat下,测试完全没有问题,找到tomcat下webapps下 并找到该工程,进入该工程目录,全选添加到  drivingSchool.zip 或  drivi ...

  4. Delphi-idHttp-JSON用法

    从国外网站抄来的代码 Delphi source: http := TIdHttp.Create(nil);http.HandleRedirects := True;//允许头转向http.ReadT ...

  5. [SDOI2015]权值

    问题描述: 有一个长度为n的实数序列,,下标从1开始,其中第k个位置的实数为p · (sin(a · k + b) + cos(c · k + d) + 2),sin和cos采用弧度制,其中p,a,b ...

  6. Spark RDD/Core 编程 API入门系列之动手实战和调试Spark文件操作、动手实战操作搜狗日志文件、搜狗日志文件深入实战(二)

    1.动手实战和调试Spark文件操作 这里,我以指定executor-memory参数的方式,启动spark-shell. 启动hadoop集群 spark@SparkSingleNode:/usr/ ...

  7. Code Forces 711D Directed Roads

    D. Directed Roads time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  8. Python抓取淘宝IP地址数据

    def fetch(ip): url = 'http://ip.taobao.com/service/getIpInfo.php?ip=' + ip result = [] try: response ...

  9. 一步一步学android控件(之二十五)—— SeekBar

    SeekBar扩展自ProgressBar——在ProgressBar的基础上添加了一个用户可以拖拽的thum. SeekBar.OnSeekBarChangeListener是接收SeekBar进度 ...

  10. jQuery获取鼠标事件源(万能)

    //任意位置 $(document).ready(function(){ $(document).click(function(){ $("#id_").hide(); }); } ...