PHP5.5或將引入Generators

最先的時候, 我記得是去年我剛加入開發組的時候, 神仙同窗曾經提過, 問我是否能夠考慮爲PHP實現yield. 我當時作過嘗試, 可是最後發現須要大改zend executor, 而當時的我尚未那麼大的魄力(由於我記得當時個人第一個RFC剛剛被拒絕)認爲我能說服那麼多人接受這個變更, 因此後來就不了了之了.git

但, 如今Nikita Popov, 完整的實現了這個RFC: Generators, 而且已經提供了一個可用的實現, 目前這個RFC在投票階段, 投票形式也比較樂觀, 因此若是不出大問題, PHP5.5將會引入這一新特性.github

我就這裏爲你們簡單介紹下, 這個新特性.數組

所謂Generators, 咱們如下稱爲」生成器」, 是一種能夠返回迭代器的生成器. 呵呵, 這話有點繞, 讓咱們看看一個代碼, 在沒有迭代器以前, 若是咱們遍歷一個動態生成的數組:函數

<?php
   function return_array() {
       $array = dummy(); //計算所有數組內容
       return $array;
   }
 
  foreach (return_array() as $v) {
  }

這裏就有一個問題, 咱們須要一次性生成所有數組內容, 而且返回, 想象一下若是數據來源很是大, 咱們沒法一次性讀入內存.google

固然, 咱們能夠採用一個類, 封裝一個支持迭代的實現:url

<?php
  class dummy implements Iterator {
     public function rewind() {
       //實現代碼
     }
    public function valid() {
       //實現代碼
    }
    public function current() {
       //實現代碼
    }
    public function key() {
       //實現代碼
    }
    public function next() {
       //實現代碼
    }
  }
 
  foreach (new Dummy() as $v) {
  }

相比這種實現, 生成器提供了一種更加簡便的選擇, 好比實現如上一樣的功能:spa

<?php
function genrators() {
   while ($i = dummy_line()) //生成數組的一個元素
   {
          yield $i;
   }
}
 
foreach (generators() as $v) {
 
}

也就是說, 每當產生一個數組元素, 就經過yield關鍵字返回成一個, 而且函數執行暫停, 當返回的迭代器的next方法被調用的時候, 會恢復剛纔函數的執行, 從上一次被yield暫停的位置開始繼續執行, 到下一次遇到yield的時候, 再次返回..net

好了, 這就是個簡單的介紹, 若是你們有興趣, 能夠搜索一下其餘已經實現了Generators語言的相關介紹.

呵呵, 你們以爲這個新特性怎麼樣呢?

相關文章
相關標籤/搜索