PHP 5.5 或將引入 Generators
最早的時候, 我記得是去年我剛加入開發組的時候, 神仙同學曾經提過, 問我是否可以考慮為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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!