php生成器詳細(xì)講解
一、生成器的概念
生成器提供了一種更容易的方法來(lái)實(shí)現(xiàn)簡(jiǎn)單的對(duì)象迭代,生成器允許你在 foreach 代碼塊中寫(xiě)代碼來(lái)迭代一組數(shù)據(jù)而不需要在內(nèi)存中創(chuàng)建一個(gè)數(shù)組, 那會(huì)使你的內(nèi)存達(dá)到上限,或者會(huì)占據(jù)可觀的處理時(shí)間。相反,你可以寫(xiě)一個(gè)生成器函數(shù),就像一個(gè)普通的自定義函數(shù)一樣, 和普通函數(shù)只返回一次不同的是, 生成器可以根據(jù)需要 yield 多次,以便生成需要迭代的值。
二、生成器的優(yōu)點(diǎn)
1、生成器會(huì)對(duì)PHP應(yīng)用的性能有非常大的影響
2、PHP代碼運(yùn)行時(shí)節(jié)省大量的內(nèi)存
3、比較適合計(jì)算大量的數(shù)據(jù)
三、生成器語(yǔ)法
生成器函數(shù)的核心是yield關(guān)鍵字。它最簡(jiǎn)單的調(diào)用形式看起來(lái)像一個(gè)return申明,不同之處在于普通return會(huì)返回值并終止函數(shù)的執(zhí)行,而yield會(huì)返回一個(gè)值給循環(huán)調(diào)用此生成器的代碼并且只是暫停執(zhí)行生成器函數(shù)。
四、生成器的簡(jiǎn)單實(shí)例
我們都知道php中有一個(gè)range函數(shù),他的作用是創(chuàng)建一個(gè)包含指定范圍的元素的數(shù)組,他的基本語(yǔ)法為range(low,high,step),表示包含從 low 到 high (包含 low 和 high)之間的整數(shù)或字符。如果 high 比 low 小,則返回反序的數(shù)組,step表示步長(zhǎng)默認(rèn)步長(zhǎng)為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ù)組的話(huà),調(diào)用range(0,10000000)時(shí)將導(dǎo)致占用內(nèi)存耗盡
這時(shí)候我們就可以使用php的生成器來(lái)實(shí)現(xiàn)
1)編寫(xiě)一個(gè)生成器函數(shù)
public function rangeText($start, $limit, $step = 1)
{
if ($start < $limit) {
if ($step <= 0) {
throw new InvalidConfigException('步長(zhǎng)至少大于0');
}
for ($i = $start; $i <= $limit; $i += $step) {
yield $i;
}
} else {
if ($step >= 0) {
throw new InvalidConfigException('步長(zhǎng)至少大于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ù)打印出來(lái)
五、生成器簡(jiǎn)單實(shí)際應(yīng)用
PHP開(kāi)發(fā)很多時(shí)候都要讀取大文件,比如csv文件、text文件,或者一些日志文件。這些文件如果很大,比如10個(gè)G。這時(shí),直接一次性把所有的內(nèi)容讀取到內(nèi)存中計(jì)算不太現(xiàn)實(shí)。那么這里生成器就可以派上用場(chǎng)
例:使用生成器讀取txt文件
1)編寫(xiě)一個(gè)讀取txt文件的生成器函數(shù)
public function readTest($txt)
{
//打開(kāi)文件
$handle = fopen($txt, 'rb');
//檢測(cè)是否已到達(dá)文件末尾
while (feof($handle)===false) {
//使用生成器逐行讀取文件數(shù)據(jù)
yield fgets($handle);
}
//關(guān)閉打開(kāi)的文件
fclose($handle);
}2)調(diào)用讀取txt文件的生成器函數(shù)
foreach ($this->readTest('test.txt') as $key=>$value) {
echo $value.'<br />';
}這時(shí)候我們就可以在瀏覽器看到txt文件中內(nèi)容了
到此這篇關(guān)于php生成器詳細(xì)講解的文章就介紹到這了,更多相關(guān)php生成器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
php幾個(gè)預(yù)定義變量$_SERVER用法小結(jié)
這篇文章主要介紹了php幾個(gè)預(yù)定義變量$_SERVER用法,實(shí)例總結(jié)了服務(wù)器端預(yù)定義變量$_SERVER的常見(jiàn)用法,需要的朋友可以參考下2014-11-11
php通過(guò)exif_read_data函數(shù)獲取圖片的exif信息
這篇文章主要介紹了php通過(guò)exif_read_data函數(shù)獲取圖片的exif信息,默認(rèn)情況下,PHP讀取圖片Exif信息模塊是不開(kāi)啟的,我們需要先開(kāi)啟這個(gè)模塊。開(kāi)啟Exif模塊需要mbstring支持,這里就不詳細(xì)說(shuō)明了,我們來(lái)先看下函數(shù)的用法2015-05-05
解析用PHP實(shí)現(xiàn)var_export的詳細(xì)介紹
本篇文章是對(duì)使用PHP實(shí)現(xiàn)var_export的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
PHP保存Base64圖片base64_decode的問(wèn)題整理
在本篇文章里小編給大家整理的是關(guān)于PHP保存Base64圖片base64_decode的問(wèn)題,需要的朋友們參考下。2019-11-11
慎用preg_replace危險(xiǎn)的/e修飾符(一句話(huà)后門(mén)常用)
要確保 replacement 構(gòu)成一個(gè)合法的 PHP 代碼字符串,否則 PHP 會(huì)在報(bào)告在包含 preg_replace() 的行中出現(xiàn)語(yǔ)法解析錯(cuò)誤2013-06-06

