当前位置:首页 > PHP教程 > php应用 > 列表

PHP生成器-动态生成内容的数组

发布: 来源: PHP粉丝网  添加日期:2022-06-03 08:38:29 浏览: 评论:0 

定义:

1.生成器:“动态生成内容的数组”,用到值的时候才去生产。

2.搭配使用:关键字 yield foreach

过程:

1.作为生成器的方法相当于定义了一个数组;

2.生成器中的 yield,每次出现相当于定义了一个数组中出现的值;

3.foreach 会遍历生成器中所有的 yield 定义的值(某个被定义的值(表达式),只有在被用到的时候,当前yield同上一个yield之间的其他表达式才会被执行,当前yield之后的表达式不会被执行);

4.foreach 正常结束的话(不是break),判断一下生成器中最后一个yield之后是否有其他表达式未执行完,是的话,执行之;

5.不同于线程,不是并行执行,只是在主业务逻辑和生成器之间来回切换执行,只节省了空间,时间没省下来。

PHP生成器-动态生成内容的数组

设想使用场景:

1、取大数据文件,生成器中逐行读取;

2、???

例子:

gen.php

  1.  
  2.   function gen() 
  3.  
  4.   { 
  5.  
  6.       echo '生成器开始执行' . PHP_EOL; 
  7.  
  8.      for ($i = 0; $i < 5; $i++) { 
  9.  
  10.           echo '产生数据之前:' . $i  . PHP_EOL; 
  11.  
  12.           yield $i;  
  13.  
  14.           echo '产生数据之后:' . $i  . PHP_EOL; 
  15.  
  16.       }    
  17.  
  18.      echo '再来一个数据' . PHP_EOL; 
  19.  
  20.      yield 5; 
  21.  
  22.      echo '生成器执行结束' . PHP_EOL; 
  23.  
  24.  }    
  25.  
  26.  $gen_func = gen(); 
  27.  
  28.  echo '生成器开始执行了吗?' . PHP_EOL; 
  29.  
  30.  foreach ($gen_func as $key  => $val) { 
  31.  
  32.      echo '使用数据前' . PHP_EOL; 
  33.  
  34.      echo '使用数据:' . $val . PHP_EOL; 
  35.  
  36.      echo '使用数据后' . PHP_EOL; 
  37.  
  38.      //if ($key >= 4) { 
  39.  
  40.          //break; 
  41.  
  42.      //}  
  43.  
  44.  } 

执行结果:

php gen.php

  1. 生成器开始执行了吗? 
  2.  
  3. 生成器开始执行 
  4.  
  5. 产生数据之前:0 
  6.  
  7. 使用数据前 
  8.  
  9. 使用数据:0 
  10.  
  11. 使用数据后 
  12.  
  13. 产生数据之后:0 
  14.  
  15. 产生数据之前:1 
  16.  
  17. 使用数据前 
  18.  
  19. 使用数据:1 
  20.  
  21. 使用数据后 
  22.  
  23. 产生数据之后:1 
  24.  
  25. 产生数据之前:2 
  26.  
  27. 使用数据前 
  28.  
  29. 使用数据:2 
  30.  
  31. 使用数据后 
  32.  
  33. 产生数据之后:2 
  34.  
  35. 产生数据之前:3 
  36.  
  37. 使用数据前 
  38.  
  39. 使用数据:3 
  40.  
  41. 使用数据后 
  42.  
  43. 产生数据之后:3 
  44.  
  45. 产生数据之前:4 
  46.  
  47. 使用数据前 
  48.  
  49. 使用数据:4 
  50.  
  51. 使用数据后 
  52.  
  53. 产生数据之后:4 
  54.  
  55. 再来一个数据 
  56.  
  57. 使用数据前 
  58.  
  59. 使用数据:5 
  60.  
  61. 使用数据后 
  62.  
  63. 生成器执行结束 

部分执行过程解读:

1、14行并没有调用生成器gen(),只是做了定义;

2、进入 foreach 循环后,开始调用gen();

3、$val 需要值的时候,记住当前位置a,执行生成器;

4、执行到 yield 定义的地方,取到值了,记住当前位置b,返回位置a;

5、循环3、4两步;

6、循环结束,执行完 yield 最后一次定义的地方的之后的剩下部分;

7、去掉20、21、22行的注释后执行,"使用数据:4 使用数据后",就不再有其他输出。

其他(仅验证了PHP7.1.14版本)

1、value);//YES value;//NO

2、可以使用yield val;

3、PHP7之后,yield from 可以调用生成器、数组、使用return等。

Tags: PHP生成器 PHP动态生成内容

分享到: