做者: Laruence( )php
最先的時候, 我記得是去年我剛加入開發組的時候, 神仙同窗曾經提過, 問我是否能夠考慮爲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語言的相關介紹.
呵呵, 你們以爲這個新特性怎麼樣呢?