摘要:輕量級集合迭代器泊學視頻鏈接泊閱文檔鏈接是加入的新語言特性。接下來,我們可以像訪問一個普通集合一樣使用現(xiàn)在重新執(zhí)行我們的文件,就不會再報錯了。簡單來說,就是一個輕量級的,可以記住自身狀態(tài)的集合迭代器。
輕量級“集合”迭代器-Generator
泊學視頻鏈接
泊閱文檔鏈接
Generator是PHP 5.5加入的新語言特性。但是,它似乎并沒有被很多PHP開發(fā)者廣泛采用。因此,在我們了解PHP 7對Generator的改進之前,我們先通過一個簡單卻顯而易見的例子來了解下Generator究竟為我們解決什么問題。
如果我們要“創(chuàng)建一個指定元素個數(shù)的數(shù)組”,怎么做呢?我們可能會不加思索的寫下下面的代碼:
function makeRange($range) { $data = []; for ($i = 0; $i < $range; $i++) { $data[] = $i; } return $data; }
然后,在我們的開發(fā)環(huán)境里,分別創(chuàng)建1萬個,10萬個,100萬個元素的數(shù)組,一切看起來都如我們想象。
makeRange(10000); makeRange(100000); makeRange(1000000);
但是,當我們創(chuàng)建一個包涵1千萬個整數(shù)的數(shù)組時,情況就不一樣了,系統(tǒng)沒有那么多內(nèi)存分配給我們:
makeRange(10000000);
在資源有限的情況下,解決大文件或大批量數(shù)據(jù)的處理問題,就是PHP generator的一個典型應用。
定義PHP generator很簡單,看上去就像定義一個函數(shù)一樣:
function makeRangeByGenerator($range) { for ($i = 0; $i < $range; $i++) { yield $i; } }
只是,makeRangeByGenerator沒有返回值,也沒有把整個數(shù)組創(chuàng)建在內(nèi)存里,而只是通過關(guān)鍵字yield,標記了每次循環(huán)應該生成的值。接下來,我們可以像訪問一個普通集合一樣使用generator:
foreach ($makeRangeByGenerator(100) as $i) { echo $i."
"; }
現(xiàn)在重新執(zhí)行我們的PHP文件,就不會再報錯了。并且,我們可以在頁面上,看到generator生成的值。這就是generator的典型應用場景,簡單來說:Generator就是一個輕量級迭代器,它可以自動的記住每一次被調(diào)用時的狀態(tài),并返回給我們正確的值。
了解了generator的基本用法之后,我們就可以看一下PHP 7對它做了哪些改進了。
PHP 7允許我們給generator加入返回值,就像我們定義函數(shù)的返回值一樣:
function makeRangeByGenerator($range) {
for ($i = 0; $i < $range; $i++) { yield $i; } return "Finish yielding";
}
迭代完generator的所有元素時,我們就可以通過getReturn()方法,來讀取generator的返回值:
$gen = makeRangeByGenerator(100); foreach ($gen as $i) { echo $i."
"; } echo $gen->getReturn();
*“我們必須在所有迭代完generator所有值之后,才能讀取generator的返回值,否則PHP會報錯。”
——最佳實踐*
PHP 7對generator的第二個改進就是允許嵌套。例如:
function outer() { yield "PHP 7 "; yield "is one of "; yield "the best "; yield from inner(); } function inner() { yield "programming languages in the world"; }
我們使用關(guān)鍵字from引入一個新的generator,當我們遍歷outer generator時,我們就會發(fā)現(xiàn),它自動生成了inner generator的值:
foreach(outer() as $str) { echo $str; }
這就是關(guān)于PHP generator的全部內(nèi)容。簡單來說,generator就是一個輕量級的,可以記住自身狀態(tài)的“集合”迭代器。如果你之前還不了解它,現(xiàn)在是時候考慮下它在哪些地方可以幫助到你了。
了解更多優(yōu)質(zhì)IT技術(shù),拓展閱讀視野,歡迎大家訪問我們的合作伙伴Segmentfault
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/30273.html
摘要:本文先回顧生成器,然后過渡到協(xié)程編程。其作用主要體現(xiàn)在三個方面數(shù)據(jù)生成生產(chǎn)者,通過返回數(shù)據(jù)數(shù)據(jù)消費消費者,消費傳來的數(shù)據(jù)實現(xiàn)協(xié)程。解決回調(diào)地獄的方式主要有兩種和協(xié)程。重點應當關(guān)注控制權(quán)轉(zhuǎn)讓的時機,以及協(xié)程的運作方式。 轉(zhuǎn)載請注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎(chǔ) web請求 cookie web響應 sess...
摘要:上手并過渡到取代的泊學原文鏈接泊學代碼秀視頻自從以來,的錯誤處理幾乎就是一成不變的。在中,這個尷尬的現(xiàn)狀,終于被徹底改變了。無論是還是傳統(tǒng)的,只要類型不匹配約束的時候,就會導致異常。 上手并過渡到PHP7 取代fatal error的engine exceptions 泊學原文鏈接泊學代碼秀視頻 自從PHP 4以來,PHP的錯誤處理幾乎就是一成不變的。只不過在PHP 5.0里添加了E_...
摘要:什么是可迭代對象可迭代對象具有屬性是一個方法的返回值是一個迭代器結(jié)合以上第二點和第三點,可以得出就是一個生成器所以我們可以給出一個可迭代對象的明確定義就是一個具有屬性,且其為一個生成器的對象,就是可迭代對象。 1: 什么是可迭代對象? 1: 可迭代對象具有Symbol.iterator屬性 2: Symbol.iterator是一個方法 3: Symbol.iterator的返回值是一...
摘要:迭代器和生成器將迭代的概念直接帶入核心語言,并提供一種機制來自定義循環(huán)的行為。本文主要會介紹中新增的迭代器和生成器。屬性本身是函數(shù),是當前數(shù)據(jù)結(jié)構(gòu)默認的迭代器生成函數(shù)。 本文是 重溫基礎(chǔ) 系列文章的第十三篇。今日感受:每次自我年終總結(jié),都會有各種情緒和收獲。 系列目錄: 【復習資料】ES6/ES7/ES8/ES9資料整理(個人整理) 【重溫基礎(chǔ)】1.語法和數(shù)據(jù)類型 【重溫基礎(chǔ)】2.流...
摘要:可迭代對象就具有屬性,它是一種與迭代器密切相關(guān)的對象。它通過指定的函數(shù)可以返回一個作用于附屬對象的迭代器。迭代器特點每次調(diào)用方法時,返回一個數(shù)組,數(shù)組中兩個元素,分別表示鍵和值。示例之輸出輸出輸出之迭代器特點返回集合中存在的每一個鍵。 Iterator由來 不推薦Iterator方法。 Iterator 函數(shù)是一個 SpiderMonkey 專有特性,并且會在某一時刻被刪除。有一點,需...
閱讀 3083·2023-04-26 00:53
閱讀 3534·2021-11-19 09:58
閱讀 1696·2021-09-29 09:35
閱讀 3286·2021-09-28 09:46
閱讀 3866·2021-09-22 15:38
閱讀 2696·2019-08-30 15:55
閱讀 3014·2019-08-23 14:10
閱讀 3828·2019-08-22 18:17