亚洲欧美日韩综合系列在线_91精品人妻一区二区_欧美大肥婆一级特大AA片_九色91视频免费观看_亚洲综合国产精品_av中文字幕在线不卡_久久精品色综合网_看黄色视频的软件_无卡无码高清中文字幕码2024_亚洲欧美日韩天堂网

PHP生成器-動(dòng)態(tài)生成內(nèi)容的數(shù)組

來源:藏色散人 發(fā)布時(shí)間:2020-05-15 09:55:17 閱讀量:1701

定義:

1.生成器:“動(dòng)態(tài)生成內(nèi)容的數(shù)組”,用到值的時(shí)候才去生產(chǎn)。

2.搭配使用:關(guān)鍵字 yield foreach

推薦:《php培訓(xùn)

過程:

1.作為生成器的方法相當(dāng)于定義了一個(gè)數(shù)組;

2.生成器中的 yield,每次出現(xiàn)相當(dāng)于定義了一個(gè)數(shù)組中出現(xiàn)的值;

3.foreach 會(huì)遍歷生成器中所有的 yield 定義的值(某個(gè)被定義的值(表達(dá)式),只有在被用到的時(shí)候,當(dāng)前yield同上一個(gè)yield之間的其他表達(dá)式才會(huì)被執(zhí)行,當(dāng)前yield之后的表達(dá)式不會(huì)被執(zhí)行);

4.foreach 正常結(jié)束的話(不是break),判斷一下生成器中最后一個(gè)yield之后是否有其他表達(dá)式未執(zhí)行完,是的話,執(zhí)行之;

5.不同于線程,不是并行執(zhí)行,只是在主業(yè)務(wù)邏輯和生成器之間來回切換執(zhí)行,只節(jié)省了空間,時(shí)間沒省下來。

c7be8cb393ea15f2cb0b0d202cb6670.png

設(shè)想使用場(chǎng)景:

1、取大數(shù)據(jù)文件,生成器中逐行讀?。?/p>

2、???

例子:

gen.php

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<?php

  function gen()

  {

      echo '生成器開始執(zhí)行' . PHP_EOL;

     for ($i = 0; $i < 5; $i++) {

          echo '產(chǎn)生數(shù)據(jù)之前:' . $i  . PHP_EOL;

          yield $i;

          echo '產(chǎn)生數(shù)據(jù)之后:' . $i  . PHP_EOL;

      }  

     echo '再來一個(gè)數(shù)據(jù)' . PHP_EOL;

     yield 5;

     echo '生成器執(zhí)行結(jié)束' . PHP_EOL;

 }  

 $gen_func = gen();

 echo '生成器開始執(zhí)行了嗎?' . PHP_EOL;

 foreach ($gen_func as $key  => $val) {

     echo '使用數(shù)據(jù)前' . PHP_EOL;

     echo '使用數(shù)據(jù):' . $val . PHP_EOL;

     echo '使用數(shù)據(jù)后' . PHP_EOL;

     //if ($key >= 4) {

         //break;

     //}

 }

執(zhí)行結(jié)果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

php gen.php

生成器開始執(zhí)行了嗎?

生成器開始執(zhí)行

產(chǎn)生數(shù)據(jù)之前:0

使用數(shù)據(jù)前

使用數(shù)據(jù):0

使用數(shù)據(jù)后

產(chǎn)生數(shù)據(jù)之后:0

產(chǎn)生數(shù)據(jù)之前:1

使用數(shù)據(jù)前

使用數(shù)據(jù):1

使用數(shù)據(jù)后

產(chǎn)生數(shù)據(jù)之后:1

產(chǎn)生數(shù)據(jù)之前:2

使用數(shù)據(jù)前

使用數(shù)據(jù):2

使用數(shù)據(jù)后

產(chǎn)生數(shù)據(jù)之后:2

產(chǎn)生數(shù)據(jù)之前:3

使用數(shù)據(jù)前

使用數(shù)據(jù):3

使用數(shù)據(jù)后

產(chǎn)生數(shù)據(jù)之后:3

產(chǎn)生數(shù)據(jù)之前:4

使用數(shù)據(jù)前

使用數(shù)據(jù):4

使用數(shù)據(jù)后

產(chǎn)生數(shù)據(jù)之后:4

再來一個(gè)數(shù)據(jù)

使用數(shù)據(jù)前

使用數(shù)據(jù):5

使用數(shù)據(jù)后

生成器執(zhí)行結(jié)束

部分執(zhí)行過程解讀:

1、14行并沒有調(diào)用生成器gen(),只是做了定義;

2、進(jìn)入 foreach 循環(huán)后,開始調(diào)用gen();

3、$val 需要值的時(shí)候,記住當(dāng)前位置a,執(zhí)行生成器;

4、執(zhí)行到 yield 定義的地方,取到值了,記住當(dāng)前位置b,返回位置a;

5、循環(huán)3、4兩步;

6、循環(huán)結(jié)束,執(zhí)行完 yield 最后一次定義的地方的之后的剩下部分;

7、去掉20、21、22行的注釋后執(zhí)行,"使用數(shù)據(jù):4 使用數(shù)據(jù)后",就不再有其他輸出。

其他(僅驗(yàn)證了PHP7.1.14版本)

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

2、可以使用yield val;

3、PHP7之后,yield from 可以調(diào)用生成器、數(shù)組、使用return等。


標(biāo)簽: PHP
分享:
評(píng)論:
你還沒有登錄,請(qǐng)先