PHP生成器-動態生成內容的陣列

2020-07-16 10:06:11
定義:

1.生成器:「動態生成內容的陣列」,用到值的時候才去生產。

2.搭配使用:關鍵字 yield foreach

過程:

1.作為生成器的方法相當於定義了一個陣列;

2.生成器中的 yield,每次出現相當於定義了一個陣列中出現的值;

3.foreach 會遍歷生成器中所有的 yield 定義的值(某個被定義的值(表示式),只有在被用到的時候,當前yield同上一個yield之間的其他表示式才會被執行,當前yield之後的表示式不會被執行);

4.foreach 正常結束的話(不是break),判斷一下生成器中最後一個yield之後是否有其他表示式未執行完,是的話,執行之;

5.不同於執行緒,不是並行執行,只是在主業務邏輯和生成器之間來回切換執行,只節省了空間,時間沒省下來。

c7be8cb393ea15f2cb0b0d202cb6670.png

設想使用場景:

1、取巨量資料檔案,生成器中逐行讀取;

2、???

例子:

gen.php

 <?php
   function gen()
   {
       echo '生成器開始執行' . PHP_EOL;
      for ($i = 0; $i < 5; $i++) {
           echo '產生資料之前:' . $i  . PHP_EOL;
           yield $i; 
           echo '產生資料之後:' . $i  . PHP_EOL;
       }   
      echo '再來一個資料' . PHP_EOL;
      yield 5;
      echo '生成器執行結束' . PHP_EOL;
  }   
  $gen_func = gen();
  echo '生成器開始執行了嗎?' . PHP_EOL;
  foreach ($gen_func as $key  => $val) {
      echo '使用資料前' . PHP_EOL;
      echo '使用資料:' . $val . PHP_EOL;
      echo '使用資料後' . PHP_EOL;
      //if ($key >= 4) {
          //break;
      //} 
  }

執行結果:

php gen.php
生成器開始執行了嗎?
生成器開始執行
產生資料之前:0
使用資料前
使用資料:0
使用資料後
產生資料之後:0
產生資料之前:1
使用資料前
使用資料:1
使用資料後
產生資料之後:1
產生資料之前:2
使用資料前
使用資料:2
使用資料後
產生資料之後:2
產生資料之前:3
使用資料前
使用資料:3
使用資料後
產生資料之後:3
產生資料之前:4
使用資料前
使用資料:4
使用資料後
產生資料之後:4
再來一個資料
使用資料前
使用資料:5
使用資料後
生成器執行結束

部分執行過程解讀:

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等。

更多程式設計相關內容,請關注TW511.COM程式設計教學欄目!

以上就是PHP生成器-動態生成內容的陣列的詳細內容,更多請關注TW511.COM其它相關文章!