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

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

高老师6年前 (2020-02-01)PHP1707

【一】.基本用法

首先看看官方对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 base64保存为图片偷懒版本

php base64保存为图片偷懒版本

<?php $base64_body = substr(strstr($_POST[base64],','),1); $data= base64_decode($base64_body); file_put_contents($_SERVER[&q...

PHP session和cookie的关联

PHP session和cookie的关联

先看看下面的代码:<?php session_start(); $_SESSION['username']='lucy'; ?>当我们请求访问上面的脚本,默认会在我们的客户端生成一个名为PHPSESSID的cookie,我这里的值是PHPSESSID=...

PHP对象转数组

PHP对象转数组

function objtoarr($obj){ $ret = array(); foreach($obj as $key =>$value){ if(gettype($value) == 'arr...

 php抽象类和接口作用

php抽象类和接口作用

【一】.抽象类假设如下场景:团队准备开发某网站,表建好了,页面设计好了.A组负责开发底层数据库操作类(DB),B组负责调用DB类.但是此时A组发生了争执,MySQL? Oracle? DB2? sqlite?到底使用什么数据库?B组.... 进入漫长的等待.解决方法:A组和B组 先定1个数据库类的模...

php 经纬度获取城市,php 经纬度转城市

php 经纬度获取城市,php 经纬度转城市

通过经纬度转换为城市名称,并获得城市的编号,通常在全国类型的商城中比较通用。//经纬度转城市名称(返回城市id,城市名称) //$ak开发密钥,$lat纬度,$lng经度,$type返回数据类型 public function getCityName($ak,$lat,$lng)...

php 将数组键值转为变量

php 将数组键值转为变量

<?php $data=array('a'=>1,'b'=>2,'c'=>3,'d'=>4); extract($data); var_dump($a,$b,$c,$d); ?>在人人商城中捡到的...