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