首頁 > 軟體

php生成器詳細講解

2022-11-03 14:01:59

一、生成器的概念

生成器提供了一種更容易的方法來實現簡單的物件迭代,生成器允許你在 foreach 程式碼塊中寫程式碼來迭代一組資料而不需要在記憶體中建立一個陣列, 那會使你的記憶體達到上限,或者會佔據可觀的處理時間。相反,你可以寫一個生成器函數,就像一個普通的自定義函數一樣, 和普通函數只返回一次不同的是, 生成器可以根據需要 yield 多次,以便生成需要迭代的值。

二、生成器的優點

1、生成器會對PHP應用的效能有非常大的影響

2、PHP程式碼執行時節省大量的記憶體

3、比較適合計算大量的資料

三、生成器語法

生成器函數的核心是yield關鍵字。它最簡單的呼叫形式看起來像一個return申明,不同之處在於普通return會返回值並終止函數的執行,而yield會返回一個值給迴圈呼叫此生成器的程式碼並且只是暫停執行生成器函數。

四、生成器的簡單範例

我們都知道php中有一個range函數,他的作用是建立一個包含指定範圍的元素的陣列,他的基本語法為range(low,high,step),表示包含從 low 到 high (包含 low 和 high)之間的整數或字元。如果 high 比 low 小,則返回反序的陣列,step表示步長預設步長為1

例如:

range(0,10)

輸出結果為:

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之間所有的陣列的話,呼叫range(0,10000000)時將導致佔用記憶體耗盡

這時候我們就可以使用php的生成器來實現

1)編寫一個生成器函數

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)呼叫生成器函數

foreach ($this->rangeText(0,10000000) as $number) {
    echo $number .'<br />';
}

呼叫生成函數之後我們就可以將0-10000000之間的所有數列印出來

五、生成器簡單實際應用

PHP開發很多時候都要讀取大檔案,比如csv檔案、text檔案,或者一些紀錄檔檔案。這些檔案如果很大,比如10個G。這時,直接一次性把所有的內容讀取到記憶體中計算不太現實。那麼這裡生成器就可以派上用場

例:使用生成器讀取txt檔案

1)編寫一個讀取txt檔案的生成器函數

public function readTest($txt)
{
    //開啟檔案
    $handle = fopen($txt, 'rb');
    //檢測是否已到達檔案末尾
    while (feof($handle)===false) {
        //使用生成器逐行讀取檔案資料
        yield   fgets($handle);
    }
    //關閉開啟的檔案
    fclose($handle);
}

2)呼叫讀取txt檔案的生成器函數

foreach ($this->readTest('test.txt') as $key=>$value) {
    echo $value.'<br />';
}

這時候我們就可以在瀏覽器看到txt檔案中內容了

到此這篇關於php生成器詳細講解的文章就介紹到這了,更多相關php生成器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com