91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中Iterator和Generator如何使用

發布時間:2021-07-27 17:44:44 來源:億速云 閱讀:120 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關PHP中Iterator和Generator如何使用,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

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

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

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

PHP 為我們提供了 Iterator 接口,只要實現了這個接口,這個對象就可以通過 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<br>";
}

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

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

生成器是 PHP 5.5 引入的新特性,但是目前貌似很少人用到它。

下面試 PHP 官方文檔上對生成器的解釋:

生成器提供了一種更容易的方法來實現簡單的對象迭代,相比較定義類實現 Iterator 接口的方式,性能開銷和復雜性大大降低。

生成器允許你在 foreach 代碼塊中寫代碼來迭代一組數據而不需要在內存中創建一個數組, 那會使你的內存達到上限,或者會占據可觀的處理時間。

相反,你可以寫一個生成器函數,就像一個普通的自定義函數一樣, 和普通函數只返回一次不同的是, 生成器可以根據需要 yield 多次,以便生成需要迭代的值。

為了體現生成器的有點,下面我們定義一個函數來進行比較:

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

因為創建如此大的數組到內存中進行迭代,則 PHP 直接提示超出了單個進程的內存限制。

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

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

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

可以看到我們調用 func1() 返回了一個 Generator 對象,這個對象可以使用 foreach 迭代,每次迭代,PHP 會要求 Generator 實例計算并提供下一個要迭代的值。

生成器的優雅體現在每次產出一個值之后,生成器的內部狀態都會停頓;

向生成器請求下一個值時,內部狀態又會恢復。生成器內部的狀態會一直在停頓和恢復之間切換,直到抵達函數定義體的末尾或遇到空的return語句為止。

以上就是PHP中Iterator和Generator如何使用,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

桑日县| 陈巴尔虎旗| 信丰县| 道真| 手机| 金堂县| 冷水江市| 宁远县| 政和县| 延吉市| 仪陇县| 鄂托克旗| 清远市| 铁岭市| 揭西县| 黔东| 武川县| 西华县| 米脂县| 根河市| 高邮市| 顺昌县| 奉新县| 广丰县| 徐闻县| 蓬莱市| 鲁山县| 曲阜市| 钟祥市| 河间市| 杂多县| 靖西县| 永安市| 普陀区| 仲巴县| 新余市| 阜康市| 嵊州市| 平凉市| 清河县| 宜宾市|