溫馨提示×

溫馨提示×

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

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

PHP中如何使用yield 關鍵字

發布時間:2021-07-23 15:44:02 來源:億速云 閱讀:269 作者:Leah 欄目:編程語言

本篇文章為大家展示了PHP中如何使用yield 關鍵字,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

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

生成器允許你在 foreach 代碼塊中寫代碼來迭代一組數據而不需要在內存中創建一個數組, 那會使你的內存達到上限,或者會占據可觀的處理時間。相反,你可以寫一個生成器函數,就像一個普通的自定義函數一樣, 和普通函數只返回一次不同的是, 生成器可以根據需要 yield 多次,以便生成需要迭代的值。

我們用偽代碼來舉個例子:

直接遍歷:

<?php//普通遍歷$User = new User(); //獲取一個可以操作數據的模型$list = $User->getAll(); //獲取所有用戶數據,返回一個大數組 ,數據越多,內存開銷就越高,會嚴重影響性能。foreach($list as $key => $v){....//對鍵值進行操作,賦值等等,嚴重影響性能。}

這時候,我們的生成器就可以派上用場了,我們看看Generator的實現:

//Generator 實現了Iterator 接口final class Generator implements Iterator {function rewind() {} //重置生成器,如果生成器當前在第一個yield之后,則拋出異常。function valid() {} //檢查,如果生成器已關閉,則返回false,否則返回true。function current() {} //返回當前產生的值function key() {} //返回當前產生的鍵
 function next() {} //繼續執行下一個function send($value) {}//設置yield表達式的返回值并恢復生成器的執行(除非生成器已經關閉)。function PS_UNRESERVE_PREFIX_throw(Throwable $exception) {} //在生成器的當前掛起點拋出異常。function getReturn() {}//返回傳遞給return的任何值,如果沒有,則返回null。如果生成器仍然有效,則拋出異常。public function __wakeup(){} //序列化回調,在生成器不能被序列化時拋出異常。}

生成器特性簡述:

1、生成器最大的優點就是迭代數據,性能開銷小,簡單易用。

2、yield必須有函數包裹,包裹yield的函數稱為”生成器函數”,該函數將返回一個可遍歷的對象

3、生成器Generator類是Iterator 的實現,但是修改了內部的邏輯。

4、生成器是暫停循環執行邏輯,等到用的時候,才會觸發循環再次執行。while 不會對它造成阻塞

<?phpfor ($i = 0;$i<10000;$i++){
  //此時循環只執行一次,除非有內容觸發(需要$i)才會再次執行
  yield $i;}

寫一個應用場景

<?php$conn = @mysqli_connect('loca1host ' , ' root ' , 'root ' , ' db' , '3306') or die('數據庫連接失敗! ');mysqli_set_charset($conn , 'utf8 ' ) or die('字符集設置失敗! ');function query($conn, $sq1){
 $res = mysq1i_query(Sconn, $sq1);
 while($row = mysqli_fetch_assoc( $res)){
   yield $row;//這樣就不需要數組保存大數據了,如果數據量夠大會產生很大的消耗
 }}//遍歷輸出$list = query($conn,'SELECT * FROM user');foreach($list as $v){ ...操作數據}

生成器可以返回表達式

此特性基于 PHP 5.5 版本中引入的生成器特性構建的。 它允許在生成器函數中通過使用 return 語法來返回一個表達式 (但是不允許返回引用值), 可以通過調用 Generator::getReturn() 方法來獲取生成器的返回值, 但是這個方法只能在生成器完成產生工作以后調用一次

<?php$gen = (function() {yield 1;yield 2;return 3;})();foreach ($gen as $val) {echo $val, PHP_EOL;}echo $gen->getReturn(), PHP_EOL;//返回123

在生成器中能夠返回最終的值是一個非常便利的特性, 因為它使得調用生成器的客戶端代碼可以直接得到生成器(或者其他協同計算)的返回值, 相對于之前版本中客戶端代碼必須先檢查生成器是否產生了最終的值然后再進行響應處理 來得方便多了。

Generator delegation

現在,只需在最外層生成其中使用 yield from, 就可以把一個生成器自動委派給其他的生成器, Traversable 對象或者 array。

<?phpfunction gen(){yield 1;yield 2;yield from gen2();}function gen2(){yield 3;yield 4;}foreach (gen() as $val){echo $val, PHP_EOL;}?>//返回

上述內容就是PHP中如何使用yield 關鍵字,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女