搜尋
首頁後端開發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應用程序更快May 12, 2025 am 12:12 AM

tomakephpapplicationsfaster,關注台詞:1)useopcodeCachingLikeLikeLikeLikeLikePachetoStorePreciledScompiledScriptbyTecode.2)MinimimiedAtabaseSqueriSegrieSqueriSegeriSybysequeryCachingandeffeftExting.3)Leveragephp7 leveragephp7 leveragephp7 leveragephpphp7功能forbettercodeefficy.4)

PHP性能優化清單:立即提高速度PHP性能優化清單:立即提高速度May 12, 2025 am 12:07 AM

到ImprovephPapplicationspeed,關注台詞:1)啟用opcodeCachingwithapCutoredUcescriptexecutiontime.2)實現databasequerycachingingusingpdotominiminimizedatabasehits.3)usehttp/2tomultiplexrequlexrequestsandreduceconnection.4 limitesclection.4.4

PHP依賴注入:提高代碼可檢驗性PHP依賴注入:提高代碼可檢驗性May 12, 2025 am 12:03 AM

依赖注入(DI)通过显式传递依赖关系,显著提升了PHP代码的可测试性。1)DI解耦类与具体实现,使测试和维护更灵活。2)三种类型中,构造函数注入明确表达依赖,保持状态一致。3)使用DI容器管理复杂依赖,提升代码质量和开发效率。

PHP性能優化:數據庫查詢優化PHP性能優化:數據庫查詢優化May 12, 2025 am 12:02 AM

DatabasequeryoptimizationinPHPinvolvesseveralstrategiestoenhanceperformance.1)Selectonlynecessarycolumnstoreducedatatransfer.2)Useindexingtospeedupdataretrieval.3)Implementquerycachingtostoreresultsoffrequentqueries.4)Utilizepreparedstatementsforeffi

簡單指南:帶有PHP腳本的電子郵件發送簡單指南:帶有PHP腳本的電子郵件發送May 12, 2025 am 12:02 AM

phpisusedforsenderemailsduetoitsbuilt-inmail()函數andsupportivelibrariesLikePhpMailerAndSwiftMailer.1)usethemail()functionForbasiceMails,butithasimails.2)butithasimail.2)

PHP性能:識別和修復瓶頸PHP性能:識別和修復瓶頸May 11, 2025 am 12:13 AM

PHP性能瓶颈可以通过以下步骤解决:1)使用Xdebug或Blackfire进行性能分析,找出问题所在;2)优化数据库查询并使用缓存,如APCu;3)使用array_filter等高效函数优化数组操作;4)配置OPcache进行字节码缓存;5)优化前端,如减少HTTP请求和优化图片;6)持续监控和优化性能。通过这些方法,可以显著提升PHP应用的性能。

PHP的依賴注入:快速摘要PHP的依賴注入:快速摘要May 11, 2025 am 12:09 AM

依賴性注射(DI)InphpisadesignPatternthatManages和ReducesClassDeptions,增強量強制性,可驗證性和MATIALWINABIOS.ItallowSpasspassingDepentenciesLikEdenciesLikedAbaseConnectionStoclasseconnectionStoclasseSasasasasareTers,interitationAseTestingEaseTestingEaseTestingEaseTestingEasingAndScalability。

提高PHP性能:緩存策略和技術提高PHP性能:緩存策略和技術May 11, 2025 am 12:08 AM

cachingimprovesphpermenceByStorcyResultSofComputationsorqucrouctationsorquctationsorquickretrieval,reducingServerLoadAndenHancingResponsetimes.feftectivestrategiesinclude:1)opcodecaching,whereStoresCompiledSinmememorytssinmemorytoskipcompliation; 2)datacaching datacachingsingMemccachingmcachingmcachings

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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具