PHP引用

猜猜下面的代碼會輸出什麼?

1
2
3
4
5
6
7
8
<?php
$a = array(1=>'one', 2=>'two');
 
foreach ($a as $key => &$val) {}// do nothing
var_dump($a);
  
foreach ($a as $key => $val) {}// do nothing
var_dump($a);

 

$a的內容變了

原因

在foreach中使用了引用,&$val,這個值並沒有在第一個foreach退出後自動清空,而是保留在內容中,當進入第二個foreach時,仍然可以訪問到$val。這個值是$a的最後一個元素的引用,所以,在第二個foreach的第一次循環時,將$a[1]的值付給$val,實際上是修改了$a的最後一個值。

第二次循環時,$val已經不是引用了,所以值再保持不變。

解決方案

第一次循環退出後,unset這個臨時變量$val,如下代碼所示:

1
2
3
4
5
6
7
8
9
<?php
$a = array(1=>'one', 2=>'two');
  
foreach ($a as $key => &$val) {}// do nothing
unset($val);// important!
var_dump($a);
 
foreach ($a as $key => $val) {}// do nothing
var_dump($a);

正常了


發佈了20 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章