国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

PHP5.5迭代生成器用法實例詳解

2024-05-04 21:50:54
字體:
來源:轉載
供稿:網友

本文實例講述了PHP5.5迭代生成器用法。分享給大家供大家參考,具體如下:

PHP5.5引入了迭代生成器的概念,迭代的概念早就在PHP有了,但是迭代生成器是PHP的一個新特性,這跟python3中的迭代生成器類似,看看PHP5.5的迭代生成器如何定義。

  1. function xrange($start$end$step = 1) { 
  2.  
  3.     for ($i = $start$i <= $end$i += $step) { 
  4.  
  5.       yield $i
  6.  
  7.     } 
  8. //Vevb.com 
  9.  
  10. foreach (xrange(1, 1000000) as $num) { 
  11.  
  12.     echo $num"/n"
  13.  

注意關鍵字:yield,正是這個yeild關鍵字構建了一個迭代器,這個函數xrange跟以往的函數的不同之處就在這里。一般情況都是return一個值,而yield一個值就表示這是個迭代器,每循環(huán)一次這個迭代器就生成這個值,故名為迭代生成器,迭代生成器這個函數可以進行foreach循環(huán),每次都產生一個值。

PHP5.5之前是通過定義類實現Iterator接口的方式來構造迭代器,通過yield構造迭代器將更加提升性能節(jié)省系統開銷。

這種方法的優(yōu)點是顯而易見的.它可以讓你在處理大數據集合的時候不用一次性的加載到內存中,甚至你可以處理無限大的數據流。

如上面例子所示,這個迭代器的功能是生成從1到1000000的數字,循環(huán)輸出,那么使用以往的方式是生成好這1到1000000的數字到數組中,將會十分占用內存,因為是事先就要生成好所有結果,而不是用的時候按需生成,也就是說調用xrange這個迭代器的時候,里面的函數還沒有真正的運行,直到你每一次的迭代。

再看看PHP官網的例子:

  1. function xrange($start$limit$step = 1) { 
  2.  
  3.   for ($i = $start$i <= $limit$i += $step) { 
  4.  
  5.     yield $i
  6.  
  7.   } 
  8.  
  9.  
  10. echo 'Single digit odd numbers: '
  11.  
  12. /* 
  13.  
  14.  * Note that an array is never created or returned, 
  15.  
  16.  * which saves memory. 
  17.  
  18.  */ 
  19.  
  20. foreach (xrange(1, 9, 2) as $number) { 
  21.  
  22.   echo "$number "
  23.  
  24.  
  25. echo "/n"

這里的xrange是一個迭代,功能和range是一樣的,如果使用range函數的話,那么函數內部實現會儲存每個迭代的中間過程,即每個中間變量都有 個內存空間,那么首先程序使用的內存空間就大了,而且分配內存,回收內存都會導致程序的運行時間加長。但是如果使用上yield實現的xrange函數的 話,里面所有的中間變量都只使用一個內存$i,這樣節(jié)省的時間和空間都會變小。

那么為什么yield會有這樣的效果呢?聯想到lua中的yield,這里就算是協程的概念了。在lua語言中,當程序運行到yield的時候,使用協程 將上下文環(huán)境記錄住,然后將程序操作權歸還到主函數,當主函數調用resume的時候,會重新喚起協程,讀取yield記錄的上下文。這樣形成了程序語言 級別的多協程操作。php 5.5這里的yield也是同樣的道理,當程序運行到yield的時候,當前程序就喚起協程記錄上下文,然后主函數繼續(xù)操作,只是php中沒有使用如 resume一樣的關鍵字,而是“在使用的時候喚起”協程。比如上例中的foreach迭代器就能喚起yield。所以上面的這個例子就能理解了。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 山东省| 勐海县| 五莲县| 南涧| 读书| 中西区| 中超| 衡南县| 绥滨县| 晋江市| 罗甸县| 吴堡县| 花莲县| 白水县| 龙游县| 馆陶县| 余江县| 响水县| 宜川县| 玉龙| 新郑市| 武义县| 郎溪县| 建水县| 江阴市| 天门市| 楚雄市| 崇信县| 临潭县| 来凤县| 长海县| 化德县| 基隆市| 罗平县| 泌阳县| 新龙县| 承德县| 沙坪坝区| 东港市| 达拉特旗| 江达县|