亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

上手并過(guò)渡到PHP7(5)——輕量級(jí)“集合”迭代器-Generator

wupengyu / 2779人閱讀

摘要:輕量級(jí)集合迭代器泊學(xué)視頻鏈接泊閱文檔鏈接是加入的新語(yǔ)言特性。接下來(lái),我們可以像訪問(wèn)一個(gè)普通集合一樣使用現(xiàn)在重新執(zhí)行我們的文件,就不會(huì)再報(bào)錯(cuò)了。簡(jiǎn)單來(lái)說(shuō),就是一個(gè)輕量級(jí)的,可以記住自身狀態(tài)的集合迭代器。

輕量級(jí)“集合”迭代器-Generator
泊學(xué)視頻鏈接
泊閱文檔鏈接
Generator是PHP 5.5加入的新語(yǔ)言特性。但是,它似乎并沒(méi)有被很多PHP開(kāi)發(fā)者廣泛采用。因此,在我們了解PHP 7對(duì)Generator的改進(jìn)之前,我們先通過(guò)一個(gè)簡(jiǎn)單卻顯而易見(jiàn)的例子來(lái)了解下Generator究竟為我們解決什么問(wèn)題。


一千萬(wàn)個(gè)整數(shù)的數(shù)組

如果我們要“創(chuàng)建一個(gè)指定元素個(gè)數(shù)的數(shù)組”,怎么做呢?我們可能會(huì)不加思索的寫(xiě)下下面的代碼:

function makeRange($range) {
    $data = [];

    for ($i = 0; $i < $range; $i++) {
        $data[] = $i;
    }

    return $data;
}

然后,在我們的開(kāi)發(fā)環(huán)境里,分別創(chuàng)建1萬(wàn)個(gè),10萬(wàn)個(gè),100萬(wàn)個(gè)元素的數(shù)組,一切看起來(lái)都如我們想象。

makeRange(10000);
makeRange(100000);
makeRange(1000000);

但是,當(dāng)我們創(chuàng)建一個(gè)包涵1千萬(wàn)個(gè)整數(shù)的數(shù)組時(shí),情況就不一樣了,系統(tǒng)沒(méi)有那么多內(nèi)存分配給我們:

makeRange(10000000);


在資源有限的情況下,解決大文件或大批量數(shù)據(jù)的處理問(wèn)題,就是PHP generator的一個(gè)典型應(yīng)用。

把PHP Generator請(qǐng)出來(lái)幫忙

定義PHP generator很簡(jiǎn)單,看上去就像定義一個(gè)函數(shù)一樣:

function makeRangeByGenerator($range) {    
for ($i = 0; $i < $range; $i++) { 
    yield $i;
    }
}

只是,makeRangeByGenerator沒(méi)有返回值,也沒(méi)有把整個(gè)數(shù)組創(chuàng)建在內(nèi)存里,而只是通過(guò)關(guān)鍵字yield,標(biāo)記了每次循環(huán)應(yīng)該生成的值。接下來(lái),我們可以像訪問(wèn)一個(gè)普通集合一樣使用generator:

foreach ($makeRangeByGenerator(100) as $i) {
    echo $i."
"; }


現(xiàn)在重新執(zhí)行我們的PHP文件,就不會(huì)再報(bào)錯(cuò)了。并且,我們可以在頁(yè)面上,看到generator生成的值。這就是generator的典型應(yīng)用場(chǎng)景,簡(jiǎn)單來(lái)說(shuō):Generator就是一個(gè)輕量級(jí)迭代器,它可以自動(dòng)的記住每一次被調(diào)用時(shí)的狀態(tài),并返回給我們正確的值。

PHP 7做了哪些改進(jìn)?

了解了generator的基本用法之后,我們就可以看一下PHP 7對(duì)它做了哪些改進(jìn)了。

PHP 7允許我們給generator加入返回值,就像我們定義函數(shù)的返回值一樣:

function makeRangeByGenerator($range) {

   for ($i = 0; $i < $range; $i++) {
       yield $i;
   }

   return "Finish yielding";

}

迭代完generator的所有元素時(shí),我們就可以通過(guò)getReturn()方法,來(lái)讀取generator的返回值:

$gen = makeRangeByGenerator(100);

foreach ($gen as $i) {
    echo $i."
"; } echo $gen->getReturn();


*“我們必須在所有迭代完generator所有值之后,才能讀取generator的返回值,否則PHP會(huì)報(bào)錯(cuò)?!?br>——最佳實(shí)踐*

PHP 7對(duì)generator的第二個(gè)改進(jìn)就是允許嵌套。例如:

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引入一個(gè)新的generator,當(dāng)我們遍歷outer generator時(shí),我們就會(huì)發(fā)現(xiàn),它自動(dòng)生成了inner generator的值:

foreach(outer() as $str) {
    echo $str;
}


這就是關(guān)于PHP generator的全部?jī)?nèi)容。簡(jiǎn)單來(lái)說(shuō),generator就是一個(gè)輕量級(jí)的,可以記住自身狀態(tài)的“集合”迭代器。如果你之前還不了解它,現(xiàn)在是時(shí)候考慮下它在哪些地方可以幫助到你了。

了解更多優(yōu)質(zhì)IT技術(shù),拓展閱讀視野,歡迎大家訪問(wèn)我們的合作伙伴Segmentfault

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/30273.html

相關(guān)文章

  • PHP回顧之協(xié)程

    摘要:本文先回顧生成器,然后過(guò)渡到協(xié)程編程。其作用主要體現(xiàn)在三個(gè)方面數(shù)據(jù)生成生產(chǎn)者,通過(guò)返回?cái)?shù)據(jù)數(shù)據(jù)消費(fèi)消費(fèi)者,消費(fèi)傳來(lái)的數(shù)據(jù)實(shí)現(xiàn)協(xié)程。解決回調(diào)地獄的方式主要有兩種和協(xié)程。重點(diǎn)應(yīng)當(dāng)關(guān)注控制權(quán)轉(zhuǎn)讓的時(shí)機(jī),以及協(xié)程的運(yùn)作方式。 轉(zhuǎn)載請(qǐng)注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎(chǔ) web請(qǐng)求 cookie web響應(yīng) sess...

    Java3y 評(píng)論0 收藏0
  • 上手過(guò)渡PHP7(4)——取代fatal error的engine exceptions

    摘要:上手并過(guò)渡到取代的泊學(xué)原文鏈接泊學(xué)代碼秀視頻自從以來(lái),的錯(cuò)誤處理幾乎就是一成不變的。在中,這個(gè)尷尬的現(xiàn)狀,終于被徹底改變了。無(wú)論是還是傳統(tǒng)的,只要類(lèi)型不匹配約束的時(shí)候,就會(huì)導(dǎo)致異常。 上手并過(guò)渡到PHP7 取代fatal error的engine exceptions 泊學(xué)原文鏈接泊學(xué)代碼秀視頻 自從PHP 4以來(lái),PHP的錯(cuò)誤處理幾乎就是一成不變的。只不過(guò)在PHP 5.0里添加了E_...

    mylxsw 評(píng)論0 收藏0
  • ES6-迭代(iterator)和生成generator)- 可迭代對(duì)象

    摘要:什么是可迭代對(duì)象可迭代對(duì)象具有屬性是一個(gè)方法的返回值是一個(gè)迭代器結(jié)合以上第二點(diǎn)和第三點(diǎn),可以得出就是一個(gè)生成器所以我們可以給出一個(gè)可迭代對(duì)象的明確定義就是一個(gè)具有屬性,且其為一個(gè)生成器的對(duì)象,就是可迭代對(duì)象。 1: 什么是可迭代對(duì)象? 1: 可迭代對(duì)象具有Symbol.iterator屬性 2: Symbol.iterator是一個(gè)方法 3: Symbol.iterator的返回值是一...

    xiao7cn 評(píng)論0 收藏0
  • 【重溫基礎(chǔ)】13.迭代和生成

    摘要:迭代器和生成器將迭代的概念直接帶入核心語(yǔ)言,并提供一種機(jī)制來(lái)自定義循環(huán)的行為。本文主要會(huì)介紹中新增的迭代器和生成器。屬性本身是函數(shù),是當(dāng)前數(shù)據(jù)結(jié)構(gòu)默認(rèn)的迭代器生成函數(shù)。 本文是 重溫基礎(chǔ) 系列文章的第十三篇。今日感受:每次自我年終總結(jié),都會(huì)有各種情緒和收獲。 系列目錄: 【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個(gè)人整理) 【重溫基礎(chǔ)】1.語(yǔ)法和數(shù)據(jù)類(lèi)型 【重溫基礎(chǔ)】2.流...

    ymyang 評(píng)論0 收藏0
  • ES6 之 Iterator&Generator

    摘要:可迭代對(duì)象就具有屬性,它是一種與迭代器密切相關(guān)的對(duì)象。它通過(guò)指定的函數(shù)可以返回一個(gè)作用于附屬對(duì)象的迭代器。迭代器特點(diǎn)每次調(diào)用方法時(shí),返回一個(gè)數(shù)組,數(shù)組中兩個(gè)元素,分別表示鍵和值。示例之輸出輸出輸出之迭代器特點(diǎn)返回集合中存在的每一個(gè)鍵。 Iterator由來(lái) 不推薦Iterator方法。 Iterator 函數(shù)是一個(gè) SpiderMonkey 專(zhuān)有特性,并且會(huì)在某一時(shí)刻被刪除。有一點(diǎn),需...

    xietao3 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<