【一】.基本用法
首先看看官方对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; 1、允许单个域名访问指定某域名(http://client.runoob.com)跨域访问,则只需在http://server.runoob.com/server.php文件头部添加如下代码:header('Access-Control-Allow-Origin:http://client....
【一】.抽象类假设如下场景:团队准备开发某网站,表建好了,页面设计好了.A组负责开发底层数据库操作类(DB),B组负责调用DB类.但是此时A组发生了争执,MySQL? Oracle? DB2? sqlite?到底使用什么数据库?B组.... 进入漫长的等待.解决方法:A组和B组 先定1个数据库类的模...
header() 函数向客户端发送原始的 HTTP 报头。(官方解释)通俗的讲header函数将参数中的字符串作为服务端的响应头来返回给客户端。什么是服务端的响应头?打开谷歌浏览器看看network中的请求response header信息即可。更多的参数百度response header即可浏览器...
开启错误提示代码:ini_set("display_errors", "On"); error_reporting(E_ALL | E_STRICT);关闭错误提示代码:error_reporting(E_ALL ^&n...
001源码:/* * $xml_str是xml字符串 */ function xmltoarray($xml_str) { //禁止XML实体扩展攻击 libxml_disable_entity_loader(true); //拒绝包含...
php官方已经提供了Iterator(迭代器)接口,通过网上资料的学习,目前看适合超大集合或者数组提取使用。学习一个函数的实现对比内存占用差距.使用迭代器和普通循环实现range()函数。(1).普通循环实现range()函数。function newrange($low, $h...