php的循環與引用的一個坑

上代碼php

$arr = array(
    'a'=> 'a11',
    'b'=> 'b22',
    'c'=> 'c33',
);  
foreach ($arr as $k=>&$v){
    // Do somethind
}
foreach ($arr as $k=>$v){
    var_dump($v);
}

這樣的代碼, var_dump 會輸出什麼?  各位能夠試試, 答案函數

string(3) "a11"
string(3) "b22"
string(3) "b22"

結果裏, 第三行變成了 key='b' 的value.  問題就出在第一個循環的引用.oop

今天就踩到了一個這樣的坑, 查問題用了好久.  簡單來講,  foreach循環使用的引用,  循環結束後有所保留. php.net 着重寫了:spa

Warning.net

Reference of a $value and the last array element remain even after the foreach loop. It is recommended to destroy it by unset().code

 

對於上面這個例子,  第一個循環結束後, $v引用仍然存在.  因爲兩個循環的變量命名一致,  第二個循環開始, $v 每次都會被賦值. 直到最後, $v 被設置成了blog

前一個元素的值.element

原理很簡單,  文檔寫的明明白白.  但若是工做中遇到相關的bug是很坑的,  定位須要好久.  還得須要寫碼的時候就注意:rem

1. 減小引用的使用文檔

2. 若是須要在foreah使用引用,  應該用函數將封裝起來

相關文章
相關標籤/搜索