標籤:理解 返回 cti 內容 function 而不是 產生 輸出 相關
概念太晦澀,看不懂,直接上例子:
問題:得到一個1-1000000的整數數組,然後用foreach遍曆輸出
如果沒有產生器,這樣做:
$arr=range(1,1000000);//這個函數最終會返回一個數組;
foreach ($arr as $key => $value) {//此時遍曆的是整個放在記憶體中的數組
echo $key.‘=>‘.$value.‘<br />‘; //輸出
}
//總結:由迭代器我們可以知道,foreach的時候,每次遍曆都會操作記憶體中的數組的索引值,改變指標指向等等,
//遍曆一次,操作一次數組,這樣很耗費記憶體
如果有產生器,這樣做:
function xrange( $start , $limit , $step = 1 ) {//簡單寫一個range()
for ( $i = $start ; $i <= $limit ; $i += $step ) {
yield $i ; //yield會將當前值返回,而不是儲存到數組中
}
}
foreach(xrange(1,1000000)as $key=>$value){//這裡遍曆時,遍曆的是一個xrange的傳回值(不是數組)
echo $key.‘=>‘."$value".‘<br />‘ ;//輸出
}
//總結:foreach每次遍曆,都會調用一次xrange函數,而每調用一次xrange函數,都能得到一個yield的傳回值,
//然後yield會將下一個值放到自己裡面,等到foreach下次遍曆yield會返回這個值,然後再將下一個值放到自己裡面...
//這就是yield,它使得foreach的時候可以不用每次遍曆都操作記憶體中的數組,遍曆的時候直接就有被遍曆的值了,
//不用再去運算元組然後再得到要被遍曆的值
至於其他相關高深內容,去查看手冊和大神們的文章吧!
ps:yield想要生效,前提是php的版本>=5.5.0
php 產生器 入門理解