php之生成器
引用手冊:一個生成器函數看起來像一個普通的函數,不同的是普通函數返回一個值,而一個生成器可以yield生成許多它所需要的值。當一個生成器被調用的時候,它返回一個可以被遍歷的對象.當你遍歷這個對象的時候(例如通過一個foreach循環(huán)),PHP 將會在每次需要值的時候調用生成器函數,并在產生一個值之后保存生成器的狀態(tài),這樣它就可以在需要產生下一個值的時候恢復調用狀態(tài)。
以下這句話會讓讓上面手冊的內容更加的理解明白。
yield關鍵字 :生成器函數的核心是yield關鍵字。它最簡單的調用形式看起來像一個return申明,不同之處在于普通return會返回值并終止函數的執(zhí)行,而yield會返回一個值給循環(huán)調用此生成器的代碼并且只是暫停執(zhí)行生成器函數。
為什么要用生成器?手冊上說道,一個簡單的例子就是使用生成器來實現range函數;因為如果使用range函數生成一個很大的數組的時候,那么占用內存是非常大的,所以使用生成器可以很好的解決這個問題。
注:請使用5.4以上版本
我在這里使用手冊里面的例子來說明一下使用生成器實現range函數;在這里我把手冊的演示刪除了一點代碼,這樣就可以專注來說生成器了:
先看一個最簡單的例子:
<?php //定一個函數 function gen_one_to_three() {//for循環(huán)for ($i = 1; $i <= 3; $i++) {//注意變量$i的值在不同的yield之間是保持傳遞的。yield $i;} }//yield會返回一個值給循環(huán)調用此生成器的代碼并且只是暫停執(zhí)行生成器函數。 $generator = gen_one_to_three(); foreach ($generator as $value) {echo "$value\n"; } ?>隨后輸出了 1 2 3
我們再看以下xrange實現(我刪掉了一些代碼):
<?php //定義xrange函數 function xrange($start, $limit, $step = 1) {//如果start小于limit那么就if ($start < $limit) {//yield會返回一個值給循環(huán)調用此生成器的代碼并且只是暫停執(zhí)行生成器函數。for ($i = $start; $i <= $limit; $i += $step) {yield $i;}} else {//yield會返回一個值給循環(huán)調用此生成器的代碼并且只是暫停執(zhí)行生成器函數。for ($i = $start; $i >= $limit; $i += $step) {yield $i;}} }/* * 注意下面range()和xrange()輸出的結果是一樣的。*/echo 'Single digit odd numbers from range(): '; //在這里使用range函數 foreach (range(1, 9, 2) as $number) {echo "$number "; } echo "<br/>";echo 'Single digit odd numbers from xrange(): '; //在這里我們使用自定義的xrange //注意:yield會返回一個值給循環(huán)調用此生成器的代碼并且只是暫停執(zhí)行生成器函數。 //所以她們的輸出是相同的 foreach (xrange(1, 9, 2) as $number) {echo "$number "; } ?>輸出如下如下:
生成一個鍵值對:這里使用的也是php手冊里面的例子,在這里我把解釋寫在了代碼的注釋中了
<?php /* * 下面每一行是用分號分割的字段組合,第一個字段將被用作鍵名。*///input變量 $input = <<<'EOF' 1;PHP;Likes dollar signs 2;Python;Likes whitespace 3;Ruby;Likes blocks EOF;//定義方法 參數為input function input_parser($input) {foreach (explode("\n", $input) as $line) {//使用explode方法用\n分隔$input字符串為數組 并且使用了foreach$fields = explode(';', $line); //分隔$line的值,此時line的值中例如 1;PHP;Likes dollar signs 用分號分隔為數組$id = array_shift($fields);//使用array_shift刪除數組的第一個值并且返回,那么如上注釋中說的,那么此時應該id就是1yield $id => $fields; //返回鍵值對} }//調用input_parser函數,傳入input foreach (input_parser($input) as $id => $fields) {echo "$id:\n";echo " $fields[0]\n";echo " $fields[1]\n"; } ?>運行如下:
身體不適。。。運動過度。。。今天就一篇吧。。。
總結
- 上一篇: 对象比较 ===三个等于号
- 下一篇: php stripslashes 去除反