yield

  • PHP 使用协同程序实现合作多任务
  • 在PHP中使用协程实现多任务调度
  • php关于Iterator (迭代)
  • PHP中instanceof关键字

  • 通过yield关键字实现模仿php range()方法(做一个生成器)

     # 该方法与range()的区别在于:range()会返回一个从$start到
     # $end,步长为$step的数组,而该方法只抽象实现中间过程
     <?php
     function xrange(int $start, int $end, int $step = 1)
     {
         $step = abs($step);
         if ($step == 0) {
             $step = 1;
         }
         if ($start > $end) {
             $step = 0 - $step;
         }
         $i = $start;
         do {
             yield $i;
             $i += $step;
             if (($step > 0 && $i <= $end) || ($step < 0 && $i >= $end)) {
                 $bool = true;
             } else {
                 $bool = false;
             }
         } while ($bool);
     }
    
     # 通过foreach关键字来迭代生成器的值
     foreach (xrange(1, 100, 5) as $num) {
         echo $num . "\n";
     }
    
     # 下面来看一下$range的本质
     $range = xrange(1, 12);
     //下面打印的结果object(Generator)#1 (0) {}说明$range是一个生成器对象
     var_dump($range);
     //下面打印的结果bool(true)说明$range是一个Iterator对象
     var_dump($range instanceof Iterator);
    
     # PHP将实现了Iterator接口中以下5个方法的类都称为iterator:
     rewind()  移到首元素
     valid()   判定是否还有后续元素,有返回true
     next()    下移一个元素
     current() 返回当前元素值
     key()     返回当前元素的键值
    
  • 通过yield关键字实现一个程序通过多个子程序同时运行来完成主程序的工作(协程)

     <?php
     function file_write($file_path)
     {
         $file_resource = fopen($file_path, 'a');
         while (true) {
             //这里sleep(1)用来模拟服务器间通信,数据库调用等耗费的时间
             sleep(1);
             fwrite($file_resource, yield . "\r\n");
         }
         fclose($file_resource);
     }
    
     $file_path = __DIR__ . '/test.log';
     $help_process = file_write($file_path);
     for ($i = 1; $i <= 120; $i++) {
         $help_process->send('第' . $i . '次写入');
     }
     echo "写完了。\n";
    
  • 希望phper们把php发扬光大

results matching ""

    No results matching ""