PHP中Generator是從PHP5.5開始加入的新特性,中文翻譯為「生成器」;Generator提供了一種方便的實作簡單的Iterator的方式,使用Generator實作Iterator不需要創建一個類別來繼承Iterator介面。
Generator是什麼
從PHP 5.5 開始,PHP 加入了一個新的特性,那就是Generator
,中文翻譯為生成器
。
Generator提供了一種方便的實作簡單的Iterator(迭代器)的方式,使用Generator實作Iterator不需要建立一個類別來繼承Iterator介面。
生成器可以簡單地用來實現物件的迭代,讓我們先從官方的一個小例子說起。
xrange
在PHP 中,我們都知道,有一個函數叫做range
,用來產生一個等差數列的數組,然後我們可以用這個陣列來進行foreach
的迭代。具體就想這樣。
foreach (range(1, 100, 2) as $num) { echo "{$num}\n"; }
這一段程式碼就會輸出首項為1 ,末項為100,公差為2 的等差數列。它的執行順序是這樣的。首先,range(1, 100, 2)
會產生一個數組,裡面存了上面那樣的一個等差數列,之後在 foreach
中對這個數組進行迭代。
那麼,這樣就會出現一個問題,如果我要產生 100 萬個數字呢?那我們就要佔用上百兆記憶體。雖然現在記憶體很便宜,但是我們也不能這麼浪費記憶體嘛。那麼這時,我們的生成器就可以排上用場了。考慮下面的程式碼。
#function xrange($start, $limit, $step = 1) { yield $start; $start++; }foreach (xrange(1, 100, 2) as $num) { echo "{$num}\n"; }
這段程式碼所的出來的結果,和前面的那段程式碼一模一樣,但是,它內部的原理是天翻地覆了。
我們剛剛說了,前面的程式碼,range
會產生一個數組,然後 foreach
來迭代這個數組,從而取出某一個值。但是這段程式碼呢,我們重新定義了一個 xrange
函數,在函數中,我們用了一個關鍵字 yield
。我們都知道定義一個函數,希望它回傳一個值得時候,用 return
來回傳。那麼這個 yield
呢,也可以回傳一個值,但是,它和 return
是截然不同的。
使用 yield
關鍵字,可以讓函數在運行的時候,中斷,同時會保存整個函數的上下文,傳回一個 Generator
類型的物件。在執行物件的next
方法時,會重新載入中斷時的上下文,繼續運行,直到出現下一個yield
為止,如果後面沒有再出現yield
,那麼就認為整個生成器結束了。
這樣,我們上面的函式呼叫可以等價地寫成這樣。
#$nums = xrange(1, 100, 2);while ($nums->valid()) { echo $nums->current() . "\n"; $nums->next(); }
在這裡,$num
是一個Generator
的物件。我們在這裡看到三個方法,valid
、current
和 next
。當我們函數執行完了,後面沒有yield
中斷了,那麼我們在xrange
函數就執行完了,那麼valid
方法就會變成false
。而 current
呢,會回傳目前 yield
後面的值,這是,生成器的函數會中斷。那麼在呼叫 next
方法之後,函數會繼續執行,直到下一個 yield
出現,或函數結束。
好了,到這裡,我們看到了透過 yield
來「產生」一個值並返回。其實,yield
其實也可以這麼寫 $ret = yield;
。同回傳值一樣,這裡是將一個值在繼續執行函數的時候,傳值進函數,可以透過 Generator::send($value)
來使用。例如。
function sum(){ $ret = yield; echo "{$ret}\n"; } $sum = sum(); $sum->send('I am from outside.');
這樣,程式就會印出 send
方法傳進去的字串了。在 yield
的兩邊可以同時有呼叫。
function xrange($start, $limit, $step = 1) { $ret = yield $start; $start++; echo "{$ret}\n"; }
而像这样的使用,send()
可以返回下一个 yield
的返回。
其它的 Generator 方法
Generator::key()
对于 yield
,我们可以这样使用 yield $id => $value
,这是,我们可以通过 key
方法来获取 $id
,而 current
方法返回的是 $value
。
Generator::rewind()
这个方法,可以帮我们让生成器重新开始执行并保存上下文,同时呢,会返回第一个 yield
返回的内容。在第一次执行 send
方法的时候,rewind
会被隐式调用。
Generator::throw()
这个方法,向生成器中,抛送一个异常。
后记
yield
作为 PHP 5.5 的新特性,让我们用了新的方法来高效地迭代数据。同时,我们还可以使用 yield
来实现协程。
更多相关知识,请访问 PHP中文网!!
以上是PHPGenerator是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

TheSecretTokeEpingAphp-PowerEdwebSiterUnningSmoothlyShyunderHeavyLoadInVolvOLVOLVOLDEVERSALKEYSTRATICES:1)emplactopCodeCachingWithOpcachingWithOpCacheToreCescriptexecution Time,2)使用atabasequercachingCachingCachingWithRedataBasEndataBaseLeSendataBaseLoad,3)

你應該關心DependencyInjection(DI),因為它能讓你的代碼更清晰、更易維護。 1)DI通過解耦類,使其更模塊化,2)提高了測試的便捷性和代碼的靈活性,3)使用DI容器可以管理複雜的依賴關係,但要注意性能影響和循環依賴問題,4)最佳實踐是依賴於抽象接口,實現鬆散耦合。

是的,優化papplicationispossibleandessential.1)empartcachingingcachingusedapcutorediucedsatabaseload.2)優化的atabaseswithexing,高效Quereteries,and ConconnectionPooling.3)EnhanceCodeWithBuilt-unctions,避免使用,避免使用ingglobalalairaiables,並避免使用

theKeyStrategiestosigantificallyBoostPhpaPplicationPerformenCeare:1)UseOpCodeCachingLikeLikeLikeLikeLikeCacheToreDuceExecutiontime,2)優化AtabaseInteractionswithPreparedStateTementStatementStatementAndProperIndexing,3)配置

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增強codemodocultion,可驗證性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

選擇DependencyInjection(DI)用於大型應用,ServiceLocator適合小型項目或原型。 1)DI通過構造函數注入依賴,提高代碼的測試性和模塊化。 2)ServiceLocator通過中心註冊獲取服務,方便但可能導致代碼耦合度增加。

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)啟用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替換loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

phpemailvalidation invoLvesthreesteps:1)格式化進行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。