国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP中的 Iterator 與 Generator

xuexiangjys / 1263人閱讀

摘要:生成器允許你在代碼塊中寫代碼來迭代一組數(shù)據(jù)而不需要在內(nèi)存中創(chuàng)建一個數(shù)組那會使你的內(nèi)存達到上限,或者會占據(jù)可觀的處理時間。生成器內(nèi)部的狀態(tài)會一直在停頓和恢復(fù)之間切換,直到抵達函數(shù)定義體的末尾或遇到空的語句為止。

在講解生成器之前先介紹一下迭代器:

在 PHP 中,通常情況下遍歷數(shù)組使用 foreach 來遍歷。

如果我們要想讓一個對象可以遍歷呢?

PHP 為我們提供了 Iterator 接口,只要實現(xiàn)了這個接口,這個對象就可以通過 foreach 來迭代。

例子如下:

class myIterator implements Iterator {
    private $index = 0;
    private $data = "";

    public function __construct($data) {
        $this->index = 0;
        $this->data = $data;
    }

    function rewind() {
        $this->index = 0;
    }

    function current() {
        return $this->data[$this->index];
    }

    function key() {
        return $this->index;
    }

    function next() {
        ++$this->index;
    }

    function valid() {
        return isset($this->data[$this->index]);
    }
}

$it = new myIterator(array(
    "hello",
    "php",
    "iterator",
));
foreach($it as $key => $value) {
    echo "$key : $value
"; }

我們通過foreach遍歷 $it 時,PHP 會自己依次調(diào)用:

rewind() 重置到第一個元素
valid() 檢查當(dāng)前位置是否有效
current() 返回當(dāng)前元素
key() 返回當(dāng)前元素的鍵
next() 指向下一個元素

生成器是 PHP 5.5 引入的新特性,但是目前貌似很少人用到它。
下面試 PHP 官方文檔上對生成器的解釋:
生成器提供了一種更容易的方法來實現(xiàn)簡單的對象迭代,相比較定義類實現(xiàn) Iterator 接口的方式,性能開銷和復(fù)雜性大大降低。
生成器允許你在 foreach 代碼塊中寫代碼來迭代一組數(shù)據(jù)而不需要在內(nèi)存中創(chuàng)建一個數(shù)組, 那會使你的內(nèi)存達到上限,或者會占據(jù)可觀的處理時間。相反,你可以寫一個生成器函數(shù),就像一個普通的自定義函數(shù)一樣, 和普通函數(shù)只返回一次不同的是, 生成器可以根據(jù)需要 yield 多次,以便生成需要迭代的值。

為了體現(xiàn)生成器的有點,下面我們定義一個函數(shù)來進行比較:

function func1()
{
    foreach (range(0, 1000000) as $value){
        echo $value;
    }
}

func1();
// ( ! ) Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 402653192 bytes) in xxx.php on line 5

因為創(chuàng)建如此大的數(shù)組到內(nèi)存中進行迭代,則 PHP 直接提示超出了單個進程的內(nèi)存限制。

下面我們換做生成器的方式來處理:

function func1()
{
    foreach (range(0, 1000000) as $value){
        yield $value;
    }
}

var_dump(func1()); // object(Generator)[1]
foreach (func1() as $value){
    echo $value;
}

可以看到我們調(diào)用 func1() 返回了一個 Generator 對象,這個對象可以使用 foreach 迭代,每次迭代,PHP 會要求 Generator 實例計算并提供下一個要迭代的值。生成器的優(yōu)雅體現(xiàn)在每次產(chǎn)出一個值之后,生成器的內(nèi)部狀態(tài)都會停頓;向生成器請求下一個值時,內(nèi)部狀態(tài)又會恢復(fù)。生成器內(nèi)部的狀態(tài)會一直在停頓和恢復(fù)之間切換,直到抵達函數(shù)定義體的末尾或遇到空的return語句為止。

參考鏈接:
https://laravelacademy.org/po...
http://php.net/manual/zh/lang...

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/29416.html

相關(guān)文章

  • PHP的生成器

    摘要:它最簡單的調(diào)用形式看起來像一個申明,不同之處在于普通會返回值并終止函數(shù)的執(zhí)行,而會返回一個值給循環(huán)調(diào)用此生成器的代碼并且只是暫停執(zhí)行生成器函數(shù)。 0x01 寫在前面 本文主要介紹: Generator的簡單用法。 Generator的底層實現(xiàn)。 本文比較長,可能會耗費你比較多的時間。如果你比較了解Generator的用法,僅想了解底層實現(xiàn),可以直接跳到底層實現(xiàn)部分。 本文分析的PH...

    LMou 評論0 收藏0
  • phpGenerator的執(zhí)行過程

    摘要:說到中的生成器,有人可能會想到協(xié)程,這里我們先不說如何實現(xiàn)協(xié)程,我們探究下的執(zhí)行過程。如果函數(shù)包含了關(guān)鍵字的,那么函數(shù)執(zhí)行后的返回值永遠都是一個對象。如果函數(shù)內(nèi)部同事包含和該函數(shù)的返回值依然是對象,但是在生成對象時,語句后的代碼被忽略。 說到php中的Generator(生成器),有人可能會想到協(xié)程,這里我們先不說php如何實現(xiàn)協(xié)程,我們探究下Generator的執(zhí)行過程。 Gene...

    Caicloud 評論0 收藏0
  • PHP 生成器入門

    摘要:執(zhí)行語句的唯一目的是結(jié)束生成器執(zhí)行。這就是需要生成器需要有返回值的意義,這也是為何我們將這個特性加入到中的原因,我們會將最后執(zhí)行的值作為返回值,但這不是一個好的解決方案。 本文首發(fā)于 入門 PHP 生成器,轉(zhuǎn)載請注明出處。 PHP 在 5.5 版本中引入了「生成器(Generator)」特性,不過這個特性并沒有引起人們的注意。在官方的 從 PHP 5.4.x 遷移到 PHP 5.5.x...

    IamDLY 評論0 收藏0
  • PHP 7.0 & 7.1 部分新增特性備忘

    摘要:以下分別備忘版本的部分新增特性。而且,在生成器沒有輸出完全時,使用會報錯。報錯定義常量數(shù)組多聲明數(shù)組解構(gòu)運行時將部分指令轉(zhuǎn)為機器碼。對于計算密集型應(yīng)用有較高的性能提升。 以下分別備忘 PHP 7.0 & 7.1 版本的部分新增特性。 PHP 7.0 ?? 運算符 $foo = null; $bar = $foo ?? 123; // 相當(dāng)于 $bar = isset($bar) ? ...

    philadelphia 評論0 收藏0

發(fā)表評論

0條評論

xuexiangjys

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<