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

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

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

【一】.基本用法

首先看看官方对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引用变量的完全理解

php引用变量的完全理解

在PHP中,大部分变量类型,如字符串,整型,浮点,数组等都是值类型的,而类和对象是引用类型.和其他语言有点差距.(1).在值类型中我们直接使用&符号表示指向对应变量的内存地址,当前变量和被指向的变量只要有1个的值被修改都会直接影响另外一个变量的值发生变化。(ps:还是非常节省内存的,可以使用...

 php max input vars,max input vars限制,max input vars 设置

php max input vars,max input vars限制,max input vars 设置

在一个正式项目中操作人员提交239个产品信息进行保存,但是系统却提示没有提交239个产品,于是开启错误信息,显示如下:Warning: Unknown: Input variables exceeded 1000. To incr...

php数组合并 array_merge和+号的区别

php数组合并 array_merge和+号的区别

array_merge是最常用的数组合并方法,+号同样也可以,但是却有很大不同。array_merge遇到相同字符串key,后面数组的key会覆盖前面数组的key,+号正好相反。$a = [ 'one' => 'A on...

swoole中的worker_num和task_worker_num

swoole中的worker_num和task_worker_num

(1)swoole启动的主进程是master进程负责全局管理,然后master进程会再fork一个manager进程。(2)manager进程开始统一管理进程创建回收管理。(3)manager进程根据设置的worker_num和task_worker_num来创建work进程和task进程因此启动s...

pcntl_signal(): Error assigning signal

pcntl_signal(): Error assigning signal

当我想在一个进程中监听kill 和 kill -9命令报了这个错误。//监听kill pcntl_signal(SIGTERM, function () {     posix_kill(0, SIGTERM); });...

php redis事务

php redis事务

概念请参考w3school文章: redis watch ,redis exec (看完基本秒懂)(1)基本事务://连接本地的 Redis 服务 $redis = new Redis(); $redis->con...