亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP7中生成器的新特性:生成器委托( yield-from )&返回值(return-value)

2020-03-22 17:24:49
字體:
來源:轉載
供稿:網友
這篇文章給大家介紹的內容是關于PHP7中生成器的新特性:生成器委托( yield-from ) 返回值(return-html' target='_blank'>value),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

生成器委托

簡單地翻譯官方文檔的描述:

PHP7中,通過生成器委托(yield from),可以將其他生成器、可迭代的對象、數組委托給外層生成器。外層的生成器會先順序 yield 委托出來的值,然后繼續 yield 本身中定義的值。

利用 yield from 可以方便我們編寫比較清晰生成器嵌套,而代碼嵌套調用是編寫復雜系統所必需的。
上例子:

 ?phpfunction echoTimes($msg, $max) { for ($i = 1; $i = $max; ++$i) { echo $msg iteration $i/n  yield;function task() { yield from echoTimes( foo , 10); // print foo ten times echo ---/n  yield from echoTimes( bar , 5); // print bar five timesforeach (task() as $item) {}

以上將輸出:

foo iteration 1foo iteration 2foo iteration 3foo iteration 4foo iteration 5foo iteration 6foo iteration 7foo iteration 8foo iteration 9foo iteration 10bar iteration 1bar iteration 2bar iteration 3bar iteration 4bar iteration 5

自然,內部生成器也可以接受它的父生成器發送的信息或者異常,因為 yield from 為父子生成器建立一個雙向的通道。不多說,上例子:

 ?phpfunction echoMsg($msg) { while (true) { $i = yield; if($i === null){ break; if(!is_numeric($i)){ throw new Exception( Hoo! must give me a number  echo $msg iteration $i/n function task2() { yield from echoMsg( foo  echo ---/n  yield from echoMsg( bar $gen = task2();foreach (range(1,10) as $num) { $gen- send($num);$gen- send(null);foreach (range(1,5) as $num) { $gen- send($num);//$gen- send( hello world //try it ,gay

輸出和上個例子是一樣的。

生成器返回值

如果生成器被迭代完成,或者運行到 return 關鍵字,是會給這個生成器返回值的。
可以有兩種方法獲取這個返回值:

使用 $ret = Generator::getReturn() 方法。

使用 $ret = yield from Generator() 表達式。

上例子:

 ?phpfunction echoTimes($msg, $max) { for ($i = 1; $i = $max; ++$i) { echo $msg iteration $i/n  yield; return $msg the end value : $i/n function task() { $end = yield from echoTimes( foo , 10); echo $end; $gen = echoTimes( bar , 5); yield from $gen; echo $gen- getReturn();foreach (task() as $item) {}

輸出結果就不貼了,想必大家都猜到。

可以看到 yield from 和 return 結合使得 yield 的寫法更像平時我們寫的同步模式的代碼了,畢竟,這就是 PHP 出生成器特性的原因之一呀。

一個非阻塞的web服務器

現在我們利用 PHP7 中的這兩個新特性重寫這個 web 服務器,只需要 100 多行代碼。

代碼如下:

 ?phpclass CoSocket protected $masterCoSocket = null; public $socket; protected $handleCallback; public $streamPoolRead = []; public $streamPoolWrite = []; public function __construct($socket, CoSocket $master = null) $this- socket = $socket; $this- masterCoSocket = $master ?? $this; public function accept() $isSelect = yield from $this- onRead(); $acceptS = null; if ($isSelect $as = stream_socket_accept($this- socket, 0)) { $acceptS = new CoSocket($as, $this); return $acceptS; public function read($size) yield from $this- onRead(); yield ($data = fread($this- socket, $size)); return $data; public function write($string) yield from $this- onWriter(); yield fwrite($this- socket, $string); public function close() unset($this- masterCoSocket- streamPoolRead[(int)$this- socket]); unset($this- masterCoSocket- streamPoolWrite[(int)$this- socket]); yield ($success = @fclose($this- socket)); return $success; public function onRead($timeout = null) $this- masterCoSocket- streamPoolRead[(int)$this- socket] = $this- socket; $pool = $this- masterCoSocket- streamPoolRead; $rSocks = []; $wSocks = $eSocks = null; foreach ($pool as $item) { $rSocks[] = $item; yield ($num = stream_select($rSocks, $wSocks, $eSocks, $timeout)); return $num; public function onWriter($timeout = null) $this- masterCoSocket- streamPoolWrite[(int)$this- socket] = $this- socket; $pool = $this- masterCoSocket- streamPoolRead; $wSocks = []; $rSocks = $eSocks = null; foreach ($pool as $item) { $wSocks[] = $item; yield ($num = stream_select($rSocks, $wSocks, $eSocks, $timeout)); return $num; public function onRequest() /** @var self $socket */ $socket = yield from $this- accept(); if (empty($socket)) { return false; $data = yield from $socket- read(8192); $response = call_user_func($this- handleCallback, $data); yield from $socket- write($response); return yield from $socket- close(); public static function start($port, callable $callback) echo Starting server at port $port.../n  $socket = @stream_socket_server( tcp://0.0.0.0:$port , $errNo, $errStr); if (!$socket) throw new Exception($errStr, $errNo); stream_set_blocking($socket, 0); $coSocket = new self($socket); $coSocket- handleCallback = $callback; function gen($coSocket) /** @var self $coSocket */ while (true) yield from $coSocket- onRequest(); foreach (gen($coSocket) as $item){};CoSocket::start(8000, function ($data) { $response = RESHTTP/1.1 200 OKContent-Type: text/plainContent-Length: 12Connection: closehello world! return $response;});

相關文章推薦:

PHP生成器Generators的簡單解析

以上就是PHP7中生成器的新特性:生成器委托( yield-from ) 返回值(return-value)的詳細內容,PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品久久久久| 亚洲激情小视频| 久久精品91久久香蕉加勒比| 亚洲免费中文字幕| 91九色蝌蚪国产| 久久久久久久久网站| 国产精品自产拍高潮在线观看| 成人欧美一区二区三区在线| 亚洲韩国日本中文字幕| 亚洲电影免费观看高清完整版在线| 亚洲欧美日韩国产中文专区| 欧美日韩性视频在线| 国产精彩精品视频| 亲子乱一区二区三区电影| 国产精品中文在线| 国产午夜精品美女视频明星a级| 2020欧美日韩在线视频| 久久99国产精品自在自在app| 国自产精品手机在线观看视频| 欧美成人免费网| 亚洲最新视频在线| 日本久久久久久| 国产精品嫩草影院久久久| 日本最新高清不卡中文字幕| 一区二区三区在线播放欧美| 国产精品第10页| 欧美成aaa人片免费看| 欧美一区二区三区免费观看| 欧美激情在线狂野欧美精品| 日韩欧美亚洲综合| 中文字幕日韩精品在线| 久久激情五月丁香伊人| 国产欧美精品一区二区三区-老狼| 国内外成人免费激情在线视频| 国产成一区二区| 亚洲一区二区三区乱码aⅴ| 久久精品久久精品亚洲人| 欧美激情xxxxx| 欧美专区在线视频| 精品久久中文字幕| 日韩免费不卡av| 国产精品综合不卡av| 91精品国产综合久久香蕉| 久久天天躁狠狠躁夜夜躁| 亚洲综合在线中文字幕| 亚洲肉体裸体xxxx137| 日韩欧美中文字幕在线观看| 国产精品视频中文字幕91| 国产欧美日韩免费看aⅴ视频| 日韩国产中文字幕| 91国产美女视频| 亚洲国模精品一区| 日本午夜人人精品| 国产美女精品视频免费观看| 色综合久久天天综线观看| 九九久久久久久久久激情| 久久影视电视剧免费网站| 国产成人精品一区二区三区| 成人h视频在线| 2019亚洲日韩新视频| 91麻豆国产语对白在线观看| 欧美人交a欧美精品| 成人av色在线观看| 欧美成人精品h版在线观看| 久久91亚洲精品中文字幕奶水| 欧美黄色www| 欧美激情一二三| 黄色一区二区在线观看| 亚洲高清免费观看高清完整版| 国产主播在线一区| 在线日韩精品视频| 日本中文字幕久久看| 久久久国产精品视频| 欧美日韩在线视频观看| 夜夜嗨av一区二区三区免费区| 亚洲护士老师的毛茸茸最新章节| 伦理中文字幕亚洲| 欧美黑人xxxx| 麻豆一区二区在线观看| 国产999精品久久久影片官网| 国产欧美在线看| 日韩av一区在线观看| 国产精品91在线| 久久精品一偷一偷国产| 欧美午夜丰满在线18影院| 91天堂在线观看| 日韩av网站大全| 日韩美女在线看| 综合136福利视频在线| 欧美片一区二区三区| 国产一区二区欧美日韩| 亚洲第一免费网站| 亚洲国产精久久久久久久| 日韩av在线网| 久久高清视频免费| 在线观看欧美www| 国产精品久久久久久久久影视| 精品国产网站地址| 欧美精品久久久久久久久| 亚洲韩国欧洲国产日产av| 国产精品爽爽ⅴa在线观看| 国产精品你懂得| 国产精品com| 精品成人在线视频| 亚洲欧洲高清在线| 欧日韩在线观看| 欧美综合在线第二页| 亚洲久久久久久久久久久| 亚洲视频电影图片偷拍一区| 亚洲xxxx视频| 日本亚洲欧美三级| 欧美日韩在线视频一区| 日韩欧美福利视频| 亚洲天堂av图片| 国产精品久久久久久久天堂| 日韩激情片免费| 日韩av在线免费观看一区| 欧美成年人网站| 亚洲va欧美va国产综合久久| 日韩精品视频在线| 国内精品久久久久久中文字幕| 亚洲精品成人久久久| 久久免费精品日本久久中文字幕| 色偷偷综合社区| 国产91热爆ts人妖在线| 日韩福利视频在线观看| 亚洲精品国产精品自产a区红杏吧| 色综合影院在线| 欧美日韩国产黄| 欧美日本黄视频| 国产va免费精品高清在线观看| 欧美黑人性猛交| 久久久久久久久久久免费精品| 日韩免费看的电影电视剧大全| 欧美大码xxxx| 欧美日韩午夜视频在线观看| 91中文精品字幕在线视频| 深夜福利一区二区| 91精品国产一区| 亚洲字幕在线观看| 中文精品99久久国产香蕉| 免费99精品国产自在在线| 久久久久北条麻妃免费看| 欧美日韩亚洲国产一区| 色综合老司机第九色激情| 国产精品福利小视频| 亚洲黄一区二区| 日韩精品在线电影| 欧美电影在线观看高清| 国产亚洲精品成人av久久ww| 亚洲精品一区二区三区婷婷月| 欧美日韩美女在线观看| 91超碰caoporn97人人| 亚洲精品女av网站| 精品久久久久久久久久久久久| 欧美成人手机在线| 一区二区av在线| 亚洲精品久久久久中文字幕二区| 欧美电影第一页| 黄色一区二区在线观看| 夜夜狂射影院欧美极品| 久久色免费在线视频| 日韩综合中文字幕| 欧美午夜片欧美片在线观看|