PHP 5.5 或將引入 Generators

jopen 12年前發布 | 4K 次閱讀 PHP

最早的時候, 我記得是去年我剛加入開發組的時候, 神仙同學曾經提過, 問我是否可以考慮為PHP實現yield. 我當時做過嘗試, 但是最后發現需要大改zend executor, 而當時的我還沒有那么大的魄力(因為我記得當時我的第一個RFC剛剛被拒絕)認為我能說服那么多人接受這個變動, 所以后來就不了了之了.

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

我就這里為大家簡單介紹下, 這個新特性.

所謂Generators, 我們以下稱為”生成器”, 是一種可以返回迭代器的生成器. 呵呵, 這話有點繞, 讓我們看看一個代碼, 在沒有迭代器之前, 如果我們遍歷一個動態生成的數組:

    <?php
       function return_array() {
           $array = dummy(); //計算全部數組內容
           return $array;
       }

      foreach (return_array() as $v) {
      }

這里就有一個問題, 我們需要一次性生成全部數組內容, 并且返回, 想象一下如果數據來源非常大, 我們無法一次性讀入內存.

當然, 我們可以采用一個類, 封裝一個支持迭代的實現:

    <?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) {
      }

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

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

    foreach (generators() as $v) {

    }

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

好了, 這就是個簡單的介紹, 如果大家有興趣, 可以搜索一下其他已經實現了Generators語言的相關介紹.

呵呵, 大家覺得這個新特性怎么樣呢?

本文來自 雪候鳥 的博客

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!