1.迭代器是一个接口,内部定义了一些方法。生成器是一种特殊的迭代器,生成器自动实现了“迭代器协议”(即__iter__和 next 方法),不需要再手动实现两方法。(这种说法不知道对不对)
2.php 协程的实现通过 yield 和 generator 。generator 提供了一种方便的实现简单的 Iterator (迭代器)的方式,使用 Generator 实现 Iterator 不需要创建一个类来继承 Iterator 接口。(对这个具体实现,能用大白话讲下吗)
3.Generator (无堆栈轻量级并发实现)这里无堆栈轻量级会存在什么缺陷?
1
SimbaPeng 2021-03-26 19:13:12 +08:00
这不是 Python?
|
2
awanganddong OP 参考 在 PHP 中使用协程实现多任务调度
https://www.laruence.com/2015/05/28/3038.html 有些含义在 php 哪里不好找,就去看看隔壁 python 的理解,应该大同小异。 |
3
awanganddong OP ```
function gen($max) { for ($i=0; $i<$max; $i++) { yield $i; } } $gen = gen(5); foreach ($gen as $key=>$val) { var_dump($key . "=>" . $val); } //以下是对应的输出值 string(4) "0=>0" string(4) "1=>1" string(4) "2=>2" string(4) "3=>3" string(4) "4=>4" ``` yield 具体的执行流程可以参考这个帖子 ## PHP 生成器--动态生成内容的数组 https://segmentfault.com/a/1190000015149274 |
4
awanganddong OP ```
<?php function gen($max) { for ($i=0; $i<$max; $i++) { yield $i=>$i+1; (注意这里是=>,而不是=号。这里为什么不能是等号暂时不明) } } $gen = gen(5); foreach ($gen as $key=>$val) { var_dump($key . "=>" . $val); } //以下是输出的值 string(4) "0=>1" string(4) "1=>2" string(4) "2=>3" string(4) "3=>4" string(4) "4=>5" ``` |
5
awanganddong OP ```
function gen() { $ret = (yield 'yield1'); var_dump($ret); echo 'A1111'.PHP_EOL; $ret = (yield 'yield2'); echo "B1111".PHP_EOL; } $gen = gen(); var_dump($gen->current()); echo 'A'.PHP_EOL; var_dump($gen->send('ret1')); echo 'B'.PHP_EOL; string(6) "yield1" A string(4) "ret1" A1111 string(6) "yield2" B ``` 上边这个不太理解的点是$gen->send()这里 //结论 send 方法将自己的发送的值传递给上一个 yield 表达式的结果, 然后继续隐式的继续执行下一个 yield 并接收下一个 yield 的值 |