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

溫馨提示×

溫馨提示×

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

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

PHP中的Generator是什么

發布時間:2020-11-26 09:46:45 來源:億速云 閱讀:599 作者:栢白 欄目:編程語言

這篇文章主要介紹了PHP中的Generator是什么,具有一定借鑒價值,需要的朋友可以參考下。下面就和我一起來看看吧。

何為 Generator

從 PHP 5.5 開始,PHP 加入了一個新的特性,那就是 Generator,中文譯為生成器。生成器可以簡單地用來實現對象的迭代,讓我們先從官方的一個小例子說起。

xrange

在 PHP 中,我們都知道,有一個函數叫做 range,用來生成一個等差數列的數組,然后我們可以用這個數組進行 foreach 的迭代。具體就想這樣。

foreach (range(1, 100, 2) as $num) {
    echo $num . PHP_EOL;
}

這一段代碼就會輸出首項為 1,末項為 100,公差為 2 的等差數列。它的執行順序是這樣的。首先,range(1, 100, 2) 會生成一個數組,里面存了上面那樣的一個等差數列,之后在 foreach 中對這個數組進行迭代。

那么,這樣就會出現一個問題,如果我要生成 100 萬個數字呢?那我們就要占用上百兆內存。雖然現在內存很便宜,但是我們也不能這么浪費內存嘛。那么這時,我們的生成器就可以排上用場了。考慮下面的代碼。

function xrange($start, $limit, $step = 1) {
    while ($start <= $limit) {
        yield $start;
        $start += $step;
    }
}

foreach (xrange(1, 100, 2) as $num) {
    echo $num . PHP_EOL;
}

這段代碼所的出來的結果,和前面的那段代碼一模一樣,但是,它內部的原理是天翻地覆了。

我們剛才說了,前面的代碼,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 的對象。我們在這里看到三個方法,validcurrentnext。當我們函數執行完了,后面沒有 yield 中斷了,那么我們在 xrange 函數就執行完了,那么 valid 方法就會變成 false。而 current 呢,會返回當前 yield 后面的值,這是,生成器的函數會中斷。那么在調用 next 方法之后,函數會繼續執行,直到下一個 yield 出現,或者函數結束。

好了,到這里,我們看到了通過 yield 來“生成”一個值并返回。其實,yield 其實也可以這么寫 $ret = yield;。同返回值一樣,這里是將一個值在繼續執行函數的時候,傳值進函數,可以通過 Generator::send($value) 來使用。例如。

function sum()
{
    $ret = yield;
    echo $ret . PHP_EOL;
}

$sum = sum();
$sum->send('I am from outside.');

這樣,程序就會打印出 send 方法傳進去的字符串了。在 yield 的兩邊可以同時有調用。

function xrange($start, $limit, $step = 1) {
    while ($start <= $limit) {
        $ret = yield $start;
        $start += $step;
        echo $ret . PHP_EOL;
    }
}

$nums = xrange(1, 100, 2);
while ($nums->valid()) {
    echo $nums->current() . "\n";
    $nums->send($nums->current() + 1);
}

而像這樣的使用,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中的Generator是什么的詳細內容了,看完之后是否有所收獲呢?如果想了解更多相關內容,歡迎來億速云行業資訊!

向AI問一下細節

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

AI

海城市| 砚山县| 扶绥县| 清远市| 梧州市| 揭西县| 渑池县| 郸城县| 二连浩特市| 平泉县| 怀化市| 乌鲁木齐市| 甘谷县| 平原县| 晋宁县| 常州市| 夏河县| 浮梁县| 庆城县| 石家庄市| 富顺县| 平陆县| 潜山县| 忻城县| 宝兴县| 保亭| 富裕县| 太仓市| 大同县| 和静县| 黎城县| 石台县| 孟州市| 亳州市| 南郑县| 上饶市| 同江市| 大方县| 漳平市| 西昌市| 张北县|