生成器迭代

手动迭代生成器,递归执行 AsyncTask::next,调用Generator::send方法将将yield值作为yield表达式结果。

  1. yield表达式可能是一个异步调用,我们这里为之后把异步调用的结果作为yield表达式结果铺垫。
  2. yield外侧括号在PHP5必须,PHP7不需要。
  1. 如, $ip = (yield async_dns_lookup(...) );
  2. ^ |--------------------|
  3. | yield
  4. | |---------------------------|
  5. yield表达式结果 yield 表达式
  1. <?php
  2. final class AsyncTask
  3. {
  4. public $gen;
  5. public function __construct(\Generator $gen)
  6. {
  7. $this->gen = new Gen($gen);
  8. }
  9. public function begin()
  10. {
  11. $this->next();
  12. }
  13. public function next($result = null)
  14. {
  15. $value = $this->gen->send($result);
  16. if ($this->gen->valid()) {
  17. $this->next($value);
  18. }
  19. }
  20. }
  1. <?php
  2. function newGen()
  3. {
  4. $r1 = (yield 1);
  5. $r2 = (yield 2);
  6. echo $r1, $r2;
  7. }
  8. $task = new AsyncTask(newGen());
  9. $task->begin(); // output: 12