今天測試遇到一個神奇的錯誤~~~ 挺有趣的,但是想一想還是合理的~ 不過很容易發生錯誤,所以寫出來給大家參考參考!
 
先來看一下,以下的程式應該會輸出甚麼結果呢?
 
<?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 就是一件非常辛苦的事情了!