核心概念
| 傳遞方式 | 記憶體行為 | 修改影響 |
| 值傳遞 | 複製數值到新記憶體空間 | 函數內修改不影響外部原值 |
| 參考傳遞 | 傳遞變數記憶體位址 | 函數內修改會改變外部原值 |
程式碼驗證
function func1($a) { $a = $a + 1; } // 值傳遞
function func2(&$a) { $a = $a + 1; } // 參考傳遞
$sample = 1;
func1($sample);
echo $sample; // 輸出 1
$sample = 1;
func2($sample);
echo $sample; // 輸出 2
圖解記憶體模型
- 值傳遞:像把房子裡的東西拿在手上,房子裡東西變了,手上不變。
- 參考傳遞:像把房子鑰匙給別人,誰進房子看到的東西都是同一份,任一方移動東西,另一方看見的也是新位置。
實務應用場景
- 大型陣列/物件:避免複製記憶體,提升效能。
- 需修改外部變數:如排序函數、計數器、資源控制代碼。
- 遞迴函數共享狀態:透過參考傳遞累積結果。
注意事項
- PHP 5.4+ 已移除
allow_call_time_pass_reference 設定,呼叫時直接用 &$var。
foreach ($arr as &$v) 迴圈中修改 $v 會改變原陣列,迴圈結束後建議 unset($v) 釋放參考。
- 物件預設即為參考行為(物件控制代碼傳遞),
clone 才會深層複製。