定義:
1.產生器:“動態產生內容的陣列”,用到值的時候才去生產。
2.搭配使用:關鍵字yield foreach
推薦:《php培訓》
過程:
1.作為生成器的方法相當於定義了一個數組;
2.生成器中的yield,每次出現相當於定義了一個數組中出現的值;
3.foreach 會遍歷生成器中所有的yield 定義的值(某個被定義的值(表達式),只有在被用到的時候,當前yield同上一個yield之間的其他表達式才會被執行,當前yield之後的表達式不會被執行);
4.foreach 正常結束的話(不是break),判斷一下生成器中最後一個yield之後是否有其他表達式未執行完,是的話,執行之;
5.不同於線程,不是並行執行,只是在主業務邏輯和生成器之間來回切換執行,只節省了空間,時間沒省下來。
設想使用場景:
#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 值;//NO
2、可以使用yield val;
3、PHP7之後,yield from 可以呼叫生成器、陣列、使用return等。
更多程式相關內容,請關注php中文網程式設計教學欄位!
以上是PHP生成器-動態生成內容的數組的詳細內容。更多資訊請關注PHP中文網其他相關文章!