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. logstash date插件

    [elk@dr-mysql01 api-access]$ date Wed Nov 30 19:21:35 CST 2016 [elk@dr-mysql01 api-access]$ [elk@dr- ...

  2. postMan 使用

    Postman功能(https://www.getpostman.com/features) 主要用于模拟网络请求包 快速创建请求 回放.管理请求 快速设置网络代理 安装 下载地址:https://w ...

  3. System.Windows.Forms中的Message Structure

    结构用途说明Implements a Windows message. Properties 1.public IntPtr HWnd { get; set; } Gets or sets the w ...

  4. mybatis源码分析(2)——事务概述

    这篇文章主要对mybatis中的事务做一简单的分析,帮助读者理清一些概念. 先来看看在JAVA事务的相关技术,在JAVA中有两类事务,JDBC事务和JTA事务,如果是JDBC类型的事务,则是由Conn ...

  5. POJ_3280_Cheapest_Palindrome_(动态规划)

    描述 http://poj.org/problem?id=3280 n 种小写字母构成长度为 m 的串,现在要通过增删字母使串回文,给出每种字母增和删的费用,求最小花费. Cheapest Palin ...

  6. Beta Round #9 (酱油杯noi考后欢乐赛)PLQ和他的小伙伴们

    题目:http://www.contesthunter.org/contest/Beta%20Round%20%EF%BC%839%20%28%E9%85%B1%E6%B2%B9%E6%9D%AFno ...

  7. C#下多进程共同读写同一文件

    最近遇到这样一个需求,用C#写一个界面,在界面上实时输出一个日志文件. 实时检测文件变化,以便刷新界面显示,可以用FileSystemWatcher组件,响应Changed事件即可. 关键是在Chan ...

  8. android报错——java.lang.ClassNotFoundException[android]

    E/AndroidRuntime(1875): Caused by: java.lang.ClassNotFoundException:XXXXX    in loader dalvik.system ...

  9. Never use GetDate() when comparing date timesoffsets, use SYSDATETIMEOFFSET()

    -- my current uk time is 2014-01-09 10:43:00 +0 ) = '2014-01-09 18:43:00 +08:00'; ) = '2014-01-09 02 ...

  10. Linux之sed详解

    转载:http://blog.chinaunix.net/u/22677/showart_1076318.html   1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保 ...