PHP 7 新增的生成器特性

今天繼續 PHP 好味道。寫 PHP 能夠樂在其中,特別是有了 PHP 7 之後。管他別人怎麼說呢,走自己的路就好啊!!!今天講的是生成器委託、生成器返回表達式,最後來個跟生成器相關的Coroutine。

生成器委託(Generator Delegation)

生成器委託(Generator Delegation)是 PHP 7 添加的特性,官方文檔描述是:

「In PHP 7, generator delegation allows you to yield values from another generator, Traversable object, or array by using the yield from keyword. The outer generator will then yield all values from the inner generator, object, or array until that is no longer valid, after which execution will continue in the outer generator.」。

生成器委託的形式為:yield <expr><expr>的結果得是可遍歷對象或數組。

<?phpndeclare(strict_types=1);nn$seh_seh_liām = function () {n $generator = function () {n yield from range(1, 3);nn foreach (range(4, 6) as $i) {n yield $i;n }n };nn foreach ($generator() as $value) {n echo "每天念 PHP 是最好的編程語言 6 遍...第 $value 遍...", PHP_EOL;n }n};nn$seh_seh_liām();n

生成器返回表達式(Generator Return Expression)

生成器返回表達式(Generator Return Expression)為生成器函數提供了增強內力,在 PHP 7 之前是無法在生成器函數內返回值的。

舉例如下:

<?phpn$traverser = (function () {n yield "foo";n yield "bar";n return "value";n})();nn$traverser->getReturn();nnforeach ($traverser as $value) {n echo "{$value}", PHP_EOL;n}nn$traverser->getReturn(); // "value"n

生成器與Coroutine

來個直接點的例子。

<?phpndeclare(strict_types=1);nnclass Coroutinen{n public static function create(callable $callback) : Generatorn {n return (function () use ($callback) {n try {n yield $callback;n } catch (Exception $e) {n echo "OH.. an error, but dont care and continue...", PHP_EOL;n }n })();n }nn public static function run(array $cos)n {n $cnt = count($cos);n while ($cnt > 0) {n $loc = random_int(0, $cnt-1); // 用 random 模擬調度策略。n $cos[$loc]->current()();n array_splice($cos, $loc, 1);n $cnt--;n }n }n}nn$co = new Coroutine();nn$cos = [];nfor ($i = 1; $i <= 10; $i++) {n $cos[] = $co::create(function () use ($i) { echo "Co.{$i}.", PHP_EOL; });n}n$co::run($cos);nn$cos = [];nfor ($i = 1; $i <= 20; $i++) {n $cos[] = $co::create(function () use ($i) { echo "Co.{$i}.", PHP_EOL; });n}n$co::run($cos);n

推薦閱讀:

如何真正零基礎入門Python?(第二節)
有哪些用代碼寫的冷笑話?
搞計算機的要考證么?
【計算機網路】 一個小白的DNS學習筆記

TAG:PHP | 软件开发 | 编程 |