場(chǎng)景
在寫項(xiàng)目的時(shí)候逛万,由于初涉PHP的賦值引用操作泳猬,覺得這個(gè)功能非常強(qiáng)大,用時(shí)一時(shí)爽宇植,沒有深入了解過其中的原理得封,導(dǎo)致了一些當(dāng)時(shí)覺得不可思議的BUG,廢話不都說当纱,我舉個(gè)例子詳細(xì)的描述一下這個(gè)問題呛每。
代碼:
$test=array('a','b','c');
foreach($test as &$value){
echo $value;
}
echo $value;
foreach($test as $value){
echo $value;
}
echo $value;
結(jié)果:
'a','b','c'
'c'
'a','b','b'
'b'
解釋:
在第一個(gè)foreach中,我們使用了賦值引用符號(hào)坡氯,它的意思是每次遍歷時(shí),$value指向的是$test數(shù)組中的對(duì)應(yīng)元素的地址洋腮,循環(huán)一次時(shí)箫柳,$value指向的是'a'的地址,第二次循環(huán)的時(shí)候啥供,$test指向的是第二個(gè)元素'b'的地址悯恍,第三次?循環(huán)時(shí),指向的就是'c'的地址伙狐。當(dāng)我們?cè)谧龅诙伪闅v的時(shí)候涮毫,其實(shí)$value變量指向的還是$test的第三個(gè)元素即'c'的地址。然后foreach本身的操作是把數(shù)組中對(duì)應(yīng)的元素賦值給as后面的變量贷屎,所以在第二個(gè)foreach中罢防,遍歷第一次的時(shí)候,把‘a(chǎn)’賦值給$value指向的地址即['a','b','a']唉侄,第二次遍歷的時(shí)候咒吐,把'b'賦值給$value指向的地址即['a','b','b'],第三次遍歷的時(shí)候属划,就把'b'賦值給$value指向的地址恬叹,這也就是為什么輸出結(jié)果是['a','b','b']而不是['a','b','c']的原因。
解決方案:
在使用完賦值引用操作符之后同眯,把變量unset掉绽昼,上例中加上unset($value)語句,相當(dāng)于取消$value對(duì)該地址的引用须蜗,這樣第二次foreach的時(shí)候硅确,$value相當(dāng)于新的變量目溉,不會(huì)導(dǎo)致上述問題。這也是一個(gè)很好的編程習(xí)慣疏魏。
實(shí)驗(yàn):
$test=array('a','b','c');
foreach($test as &$value){
//對(duì)$value進(jìn)行操作
}
var_dump($test);
大家如果運(yùn)行一下的話停做,會(huì)發(fā)現(xiàn)瀏覽器打印出來的結(jié)構(gòu)是這樣的:
array (size=3)
0 => string 'a' (length=1)
1 => string 'b' (length=1)
2 => &string 'c' (length=1)
大家有木有發(fā)現(xiàn),元素'c'的前面有個(gè)賦值引用符號(hào)’&‘大莫,原因就在這里蛉腌。