当前位置:首页 > PHP > 正文内容

php生成器的send方法详解,php yield send

高老师7年前 (2020-02-01)PHP1873

【一】.基本用法

首先看看官方对send方法的解释:

Sets the return value of the yield expression and resumes the generator (unless the generator is already closed).设置yield表达式的返回值并恢复生成器(除非生成器已经关闭)。

个人理解的说明:

send方法将自己的发送的值传递给上一个yield表达式的结果,然后继续隐式的继续执行下一个yield并接收下一个yield的值

带着上面的个人理解来看第一个例子:

function gen()
{
    $ret = (yield '1');
    var_dump($ret); //Hi1只会在这里打印的,这个值不会返回给send
    $ret = (yield '2');
    var_dump($ret); //Hi2只会在这里打印的,这个值不会返回给send
}

$gen = gen();
var_dump($gen->current());
var_dump($gen->send('Hi1'));
var_dump($gen->send('Hi2'));

输出结果:

string(1) "1"
string(3) "Hi1"
string(1) "2"
string(3) "Hi2"
NULL

解释执行过程:

首先$gen->current()一定是执行当前的第一个迭代输出1毫无疑问,然后$gen->send('Hi1') 将Hi1这个值传递给上一个yield表达式的结果,也就是$ret = (yield '1');那么此时ret的值变为了Hi1,所以输出Hi1,然后send会恢复去执行下一个yield,下一个yield的返回值是2,这个2返回给send了,于是打印输出2。然后$gen->send('Hi2') 将Hi2这个值传递给上一个yield表达式的结果,并且在生成器中打印了,继续走向下一个yield,但是没有下一个yield,因此返回了null给send方法。

【二】.迭代器被创建的时候一个renwind()方法已经被隐式调用,而且忽略表达式的返回值,因此send拿到的是yield就是第二个yield

首先看下面的代码:

function gen()
{
    $ret = (yield '1');
    $ret = (yield '2');
}

$gen = gen();
var_dump($gen->send('Hi1'));

输出结果:

string(1) "2"

因此我们通过send的特性可以实现简单的生成器收发消息

function gen()
{
    $ret = (yield '1');
    echo 'recv:'. ($ret) . PHP_EOL;
    $ret = (yield '2');
}

$gen = gen();
echo $gen->current() . PHP_EOL;
echo ($gen->send('Hi1')) . PHP_EOL;

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/120.html

分享给朋友:

“php生成器的send方法详解,php yield send” 的相关文章

php trait的使用

php trait的使用

PHP不像net支持多继承,自身只支持单继承,为了解决这个问题,php出了Trait这个特性,减少单继承语言的限制。并且能让代码复用率更高。说白了就是一个对象的属性和方法扩展工具一样。例如:trait exts {     public f...

php上传大文件,php大文件上传

php上传大文件,php大文件上传

(1).前端文件:<form action="upload.php" method="post" enctype="multipart/form-data">    &...

Thinkphp Call Stack,PHP调用栈Call Stack的获取

Thinkphp Call Stack,PHP调用栈Call Stack的获取

ThinkPHP中有一个debug调试功能,能输出报错文件的信息,并能看到这个函数被哪些函数调用,从框架的启动开始记录,特别方便调试。于是研究了下它的底层给予了实现。<?php //--框架核心--Start //框架内置错误处理 function errDealWith($er...

PHP Warning:  ftok(): Project identifier is invalid

PHP Warning: ftok(): Project identifier is invalid

在使用ftok生成ipc进程通信key尝试将第二个参数项目标识符传入字符串报错:PHP Warning:  ftok(): Project identifier is invalid,查阅资料发现第二个字符串只能是1个字符串,长度为1....

composer自动加载类库(非psr4规范的文件)

composer自动加载类库(非psr4规范的文件)

在项目下的composer配置文件修改(PaySdk是我这里一个支付sdk的目录,包含各种各样的支付sdk,这样写的意思让composer自动把PaySdk下的所有文件自动加载):"autoload": {      &...

php端口复用,php socket端口复用

php端口复用,php socket端口复用

第一次听说端口复用是在mixphp最新版本中发现的,mixphp启动监听9501端口,现在作者说可以多开几个进程来执行mixphp,我心里想了下再启动不是会端口冲突嘛,但是却没有问题,于是下载mixphp的源码解读,原来是启动http服务器使用new Co\Http\Server('0.0....