搜尋
首頁後端開發php教程PHP主| PHP中的發電機

PHP Master | Generators in PHP

核心要點

  • PHP生成器提供了一種簡便的方法來實現迭代器,無需複雜的Iterator接口,而是使用yield關鍵字代替return來保存其狀態,並在再次調用時從中斷處繼續。
  • 在處理大型數據集時,生成器非常節省內存,因為它們只需要為當前結果分配內存,而不需要像數組那樣一次性將所有值存儲在內存中。
  • 儘管生成器像迭代器一樣工作,但它本質上是一個函數,可以通過調用生成器對象的send()方法來返回值和接收外部值。它還可以用於另一個生成器中,這被稱為生成器委託。

如果您關注過我之前關於迭代器的文章,您就會知道迭代是一個重要的編程概念,但是實現創建可迭代對象的必要接口充其量是一件麻煩事,因為需要大量的樣板代碼。隨著PHP 5.5的發布,我們終於有了生成器!在本文中,我們將了解生成器,它提供了一種簡單的方法來實現簡單的迭代器,而無需Iterator接口的開銷或複雜性。

生成器的工作原理

根據維基百科的定義,生成器“非常類似於返回數組的函數,因為生成器具有參數,可以被調用,並生成一系列值”。生成器基本上是一個普通的函數,但它不是返回值,而是根據需要產生任意多個值。它看起來像一個函數,但行為像一個迭代器。生成器使用yield關鍵字代替return。它的作用類似於return,因為它將值返回給函數的調用者,但是yield不會將函數從堆棧中移除,而是保存其狀態。這允許函數從中斷處繼續執行。事實上,您不能從生成器中返回值,儘管您可以使用不帶值的return來終止其執行。 PHP手冊指出:“當調用生成器函數時,它會返回一個可以迭代的對象。”這是一個內部Generator類的對象,它以與僅向前迭代器對象相同的方式實現Iterator接口。當您迭代該對象時,PHP每次需要一個值時都會調用生成器。當生成器產生值時,狀態會被保存,以便在需要下一個值時可以恢復。

<?php
function nums() {
    echo "The generator has started\n";
    for ($i = 0; $i < 5; $i++) {
        yield $i;
        echo "Yielded $i\n";
    }
    echo "The generator has ended\n";
}

foreach (nums() as $v);
?>

上述代碼的輸出將是:

<code>The generator has started
Yielded 0
Yielded 1
Yielded 2
Yielded 3
Yielded 4
The generator has ended</code>

我們的第一個生成器

生成器並非一個新概念,它已經存在於C#、Python、JavaScript和Ruby(枚舉器)等語言中,通常通過使用yield關鍵字來識別。以下是一個Python示例:

def file_lines(filename):
    file = open(filename)
    for line in file:
        yield line
    file.close()

for line in file_lines('somefile'):
    #do some work here

讓我們用PHP重寫Python生成器示例。 (請注意,這兩個代碼片段都沒有執行任何錯誤檢查。)

<?php
function nums() {
    echo "The generator has started\n";
    for ($i = 0; $i < 5; $i++) {
        yield $i;
        echo "Yielded $i\n";
    }
    echo "The generator has ended\n";
}

foreach (nums() as $v);
?>

生成器函數打開一個文件,然後根據需要產生文件的每一行。每次調用生成器時,它都會從中斷處繼續執行。它不會從頭開始,因為當執行yield語句時,它的狀態已被保存。一旦所有行都被讀取,生成器就會簡單地終止,循環結束。

返回鍵

PHP迭代器由鍵/值對組成。在我們的示例中,只返回了一個值,因此鍵是數字(默認情況下鍵是數字)。如果您希望返回一個關聯對,只需更改yield語句以使用數組語法包含鍵即可。

<code>The generator has started
Yielded 0
Yielded 1
Yielded 2
Yielded 3
Yielded 4
The generator has ended</code>

注入值

yield不僅返回值;它還可以接收外部的值。這是通過使用您希望傳遞的值調用生成器對象的send()方法來完成的。然後,該值可用於計算或執行其他操作。該方法將值作為yield表達式的結果發送到生成器,並恢復執行。

def file_lines(filename):
    file = open(filename)
    for line in file:
        yield line
    file.close()

for line in file_lines('somefile'):
    #do some work here

輸出將是:

<?php
function file_lines($filename) {
    $file = fopen($filename, 'r');
    while (($line = fgets($file)) !== false) {
        yield $line;
    }
    fclose($file);
}

foreach (file_lines('somefile') as $line) {
    // do some work here
}
?>

使用生成器節省內存

當您計算大型集合併且不想同時為所有結果分配內存,或者當您不知道是否需要所有結果時,生成器非常有用。由於結果的處理方式,通過僅為當前結果分配內存,可以將內存佔用量減少到非常低的水平。想像一下file()函數,它將文件中的所有行作為數組返回。對file()函數和我們的演示file_lines()函數運行一個簡單的基準測試,每個函數都使用使用Lipsum生成的相同的隨機100段文本文件,結果顯示file函數使用的內存最多是生成器的110倍。

<?php
function file_lines($filename) {
    // ...
        yield $key => $line;
    // ...
}

foreach (file_lines('somefile') as $key => $line) {
    // do some work here
}
?>

結論

隨著生成器的引入,PHP為開發人員提供了一個強大的工具。我們現在可以快速編寫迭代器,同時節省大量內存。通過本教程,我希望您已經獲得了足夠的知識,可以在您的項目中自己開始使用它們。就我個人而言,我已經想好了很多要重寫的對象。如果您有任何想法或意見,請留下您的評論。

PHP生成器的常見問題解答

(此處應包含原文中列出的常見問題解答,由於篇幅限制,此處省略。)

以上是PHP主| PHP中的發電機的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
繼續使用PHP:耐力的原因繼續使用PHP:耐力的原因Apr 19, 2025 am 12:23 AM

PHP仍然流行的原因是其易用性、靈活性和強大的生態系統。 1)易用性和簡單語法使其成為初學者的首選。 2)與web開發緊密結合,處理HTTP請求和數據庫交互出色。 3)龐大的生態系統提供了豐富的工具和庫。 4)活躍的社區和開源性質使其適應新需求和技術趨勢。

PHP和Python:探索他們的相似性和差異PHP和Python:探索他們的相似性和差異Apr 19, 2025 am 12:21 AM

PHP和Python都是高層次的編程語言,廣泛應用於Web開發、數據處理和自動化任務。 1.PHP常用於構建動態網站和內容管理系統,而Python常用於構建Web框架和數據科學。 2.PHP使用echo輸出內容,Python使用print。 3.兩者都支持面向對象編程,但語法和關鍵字不同。 4.PHP支持弱類型轉換,Python則更嚴格。 5.PHP性能優化包括使用OPcache和異步編程,Python則使用cProfile和異步編程。

PHP和Python:解釋了不同的範例PHP和Python:解釋了不同的範例Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP和Python:深入了解他們的歷史PHP和Python:深入了解他們的歷史Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

在PHP和Python之間進行選擇:指南在PHP和Python之間進行選擇:指南Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP和框架:現代化語言PHP和框架:現代化語言Apr 18, 2025 am 12:14 AM

PHP在現代化進程中仍然重要,因為它支持大量網站和應用,並通過框架適應開發需求。 1.PHP7提升了性能並引入了新功能。 2.現代框架如Laravel、Symfony和CodeIgniter簡化開發,提高代碼質量。 3.性能優化和最佳實踐進一步提升應用效率。

PHP的影響:網絡開發及以後PHP的影響:網絡開發及以後Apr 18, 2025 am 12:10 AM

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型?PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型?Apr 17, 2025 am 12:25 AM

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。