php生成器詳細(xì)講解
目錄
- 一、生成器的概念
- 二、生成器的優(yōu)點
- 三、生成器語法
- 四、生成器的簡單實例
- 五、生成器簡單實際應(yīng)用
一、生成器的概念
生成器提供了一種更容易的方法來實現(xiàn)簡單的對象迭代,生成器允許你在 foreach 代碼塊中寫代碼來迭代一組數(shù)據(jù)而不需要在內(nèi)存中創(chuàng)建一個數(shù)組, 那會使你的內(nèi)存達到上限,或者會占據(jù)可觀的處理時間。相反,你可以寫一個生成器函數(shù),就像一個普通的自定義函數(shù)一樣, 和普通函數(shù)只返回一次不同的是, 生成器可以根據(jù)需要 yield 多次,以便生成需要迭代的值。
二、生成器的優(yōu)點
1、生成器會對PHP應(yīng)用的性能有非常大的影響
2、PHP代碼運行時節(jié)省大量的內(nèi)存
3、比較適合計算大量的數(shù)據(jù)
三、生成器語法
生成器函數(shù)的核心是yield關(guān)鍵字。它最簡單的調(diào)用形式看起來像一個return申明,不同之處在于普通return會返回值并終止函數(shù)的執(zhí)行,而yield會返回一個值給循環(huán)調(diào)用此生成器的代碼并且只是暫停執(zhí)行生成器函數(shù)。
四、生成器的簡單實例
我們都知道php中有一個range函數(shù),他的作用是創(chuàng)建一個包含指定范圍的元素的數(shù)組,他的基本語法為range(low,high,step),表示包含從 low 到 high (包含 low 和 high)之間的整數(shù)或字符。如果 high 比 low 小,則返回反序的數(shù)組,step表示步長默認(rèn)步長為1
例如:
range(0,10)
輸出結(jié)果為:
Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 [9] => 9 [10] => 10 )
但是如果我們想要獲取1-10000000之間所有的數(shù)組的話,調(diào)用range(0,10000000)時將導(dǎo)致占用內(nèi)存耗盡
這時候我們就可以使用php的生成器來實現(xiàn)
1)編寫一個生成器函數(shù)
public function rangeText($start, $limit, $step = 1) { if ($start < $limit) { if ($step <= 0) { throw new InvalidConfigException("步長至少大于0"); } for ($i = $start; $i <= $limit; $i += $step) { yield $i; } } else { if ($step >= 0) { throw new InvalidConfigException("步長至少大于0"); } for ($i = $start; $i >= $limit; $i += $step) { yield $i; } } }
2)調(diào)用生成器函數(shù)
foreach ($this->rangeText(0,10000000) as $number) { echo $number ."<br />"; }
調(diào)用生成函數(shù)之后我們就可以將0-10000000之間的所有數(shù)打印出來
五、生成器簡單實際應(yīng)用
PHP開發(fā)很多時候都要讀取大文件,比如csv文件、text文件,或者一些日志文件。這些文件如果很大,比如10個G。這時,直接一次性把所有的內(nèi)容讀取到內(nèi)存中計算不太現(xiàn)實。那么這里生成器就可以派上用場
例:使用生成器讀取txt文件
1)編寫一個讀取txt文件的生成器函數(shù)
public function readTest($txt) { //打開文件 $handle = fopen($txt, "rb"); //檢測是否已到達文件末尾 while (feof($handle)===false) { //使用生成器逐行讀取文件數(shù)據(jù) yield fgets($handle); } //關(guān)閉打開的文件 fclose($handle); }
2)調(diào)用讀取txt文件的生成器函數(shù)
foreach ($this->readTest("test.txt") as $key=>$value) { echo $value."<br />"; }
這時候我們就可以在瀏覽器看到txt文件中內(nèi)容了
到此這篇關(guān)于php生成器詳細(xì)講解的文章就介紹到這了,更多相關(guān)php生成器內(nèi)容請搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!
