首頁 >後端開發 >php教程 >PHP動態產生內容的陣列(生成器)的解析

PHP動態產生內容的陣列(生成器)的解析

不言
不言原創
2018-08-04 09:45:412553瀏覽

這篇文章要跟大家介紹的內容是關於PHP動態生成內容的陣列(生成器)的解析,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

定義:

產生器:“動態產生內容的陣列”,用到值的時候才去生產。
搭配使用:關鍵字yield foreach

過程:

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

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

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

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

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

PHP動態產生內容的陣列(生成器)的解析

設想使用場景:

1、取大資料文件,生成器中逐行讀取;
2、? ? ?

範例:

  gen.php
  1 <?php   2 function gen()
  3 {
  4     echo &#39;生成器开始执行&#39; . PHP_EOL;
  5     for ($i = 0; $i < 5; $i++) {
  6         echo &#39;产生数据之前:&#39; . $i  . PHP_EOL;
  7         yield $i; 
  8         echo &#39;产生数据之后:&#39; . $i  . PHP_EOL;
  9     }   
 10     echo &#39;再来一个数据&#39; . PHP_EOL;
 11     yield 5;
 12     echo &#39;生成器执行结束&#39; . PHP_EOL;
 13 }   
 14 $gen_func = gen();
 15 echo &#39;生成器开始执行了吗?&#39; . PHP_EOL;
 16 foreach ($gen_func as $key  => $val) {
 17     echo '使用数据前' . PHP_EOL;
 18     echo '使用数据:' . $val . PHP_EOL;
 19     echo '使用数据后' . PHP_EOL;
 20     //if ($key >= 4) {
 21         //break;
 22     //} 
 23 }

執行結果:

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、$data = (yield $value);//YES  $data = yield $value;/ /NO
2、可以使用yield $key => $val;
3、PHP7之後,yield from 可以呼叫生成器、陣列、使用return等。
(傳送門:PHP手冊裡都有)

相關文章推薦:

PHP7中生成器的新特性:生成器委託( yield-from )&返回值(return-value)

PHP生成器Generators的簡單解析

以上是PHP動態產生內容的陣列(生成器)的解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn