今天測試遇到一個神奇的錯誤~~~ 挺有趣的,但是想一想還是合理的~ 不過很容易發生錯誤,所以寫出來給大家參考參考!
先來看一下,以下的程式應該會輸出甚麼結果呢?
<?php
$data = array();
$data[0] = 'apple';
$data[1] = 'banana';
$data[2] = 'car';
$data[3] = 'dog';
echo "1. first round<BR /> \n";
foreach($data as &$row) {
echo "{$row} <BR /> \n";
}
echo "2. second round<BR /> \n";
foreach($data as $row) {
echo "{$row} <BR /> \n";
}
直覺來看,應該會輸出
1. first round apple banana car dog 2. second round apple banana car dog
但是很不幸的!~ 會輸出
1. first round apple banana car dog 2. second round apple banana car car
Dog 不見,而且 Car 重複了!!!!
這是為什麼呢? 原來在 first round 的時候,因為設定 $row 為 reference 的關係,所以 first round 跑完後,其實 $row 指向 $data[3]。
而 second round 的時候,再把 $data 的值透過 foreach 抓出來,寫入 $row 的時候,其實就不斷的改變 $data[3] 的值。所以到最後一個項目時,$data[3] 自然而然就等於 car,而 dog 就掰了!~~
這個事情告訴我們, reference 要小心使用~! 尤其在 foreach 時,其實常常會習慣使用某些暫時的變數,而且名字相同。若是恰巧這兩次使用距離很遠的時候,Debug 就是一件非常辛苦的事情了!



