【一】.基本用法
首先看看官方对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;
<?php //设置Cookies数组 setcookie('Datatype[a]', '1'); setcookie('Datatype[b]', '2'); set...
header() 函数向客户端发送原始的 HTTP 报头。(官方解释)通俗的讲header函数将参数中的字符串作为服务端的响应头来返回给客户端。什么是服务端的响应头?打开谷歌浏览器看看network中的请求response header信息即可。更多的参数百度response header即可浏览器...
本篇文章不是讲解如何用.net开发自己的dll然后PHP通过com调用。主要记录PHP官方支持的DOTNET 基本语法如下:$obj = new DOTNET("assembly", "classname")a...
最近在项目中处理一个关于商品数据重复需要删除多余的商品记录,但是删除一条商品必然要把关联的其他表商品的id和其他商品信息更换为正确的,删除一个商品记录,同时要去修改100多张表的关联商品数据,在项目中引用了tp orm 1.2版本,由于项目是php5.6版本,没法使用最新orm,在代码中每处理1个商...
本教程使用的定时任务基于EasyTak,EasyTask官方文档:https://gitee.com/392223903/EasyTask(1).安装tp5.0或者5.1composer create-project topthink/think=5.0.* tp5&n...
在调用微信code换openid的接口curl报错curl Received HTTP code 403 from proxy after CONNECT,错误码56。可以看到是curl的代理有问题。然后我自己电脑设置代理去访问curl请求的地址,的确也返回了403,说明代理不允许访问这个地址,联系...