【一】.基本用法
首先看看官方对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; 上家公司开发医院挂号系统,系统采用GBK编码。ajax发送的中文用户名让PHP保存为cookie出现乱码的解决方案。1.Javascript变量var user=document.getElementById('user').innerText; user=escape(u...
在PHP中,大部分变量类型,如字符串,整型,浮点,数组等都是值类型的,而类和对象是引用类型.和其他语言有点差距.(1).在值类型中我们直接使用&符号表示指向对应变量的内存地址,当前变量和被指向的变量只要有1个的值被修改都会直接影响另外一个变量的值发生变化。(ps:还是非常节省内存的,可以使用...
源码:特别适用于微信支付中通知微信支付网关function array2xml($arr, $level = 1) { $s = $level == 1 ? "<xml&g...
php arrayaccess 官方的说法是让你能以数组的形式访问对象,对于这种php内置接口一直不太明白有什么用,坚持多看文章,终于理解,特来分享,思路不同,更易于理解。(1).创建一个学生类,并且实现arrayaccess 接口。<?php class studen...
(1).前端文件:<form action="upload.php" method="post" enctype="multipart/form-data"> &...
参数中包含gb2312的字符串,返回结果是false或者null(不同PHP版本具有差异性)代码:<?php $dbms = 'mysql'; $host = '192.168.8.8'; $dbName =&n...