PHP 的參考(Reference)讓多個變數名稱指向同一記憶體位址。理解其行為對避免難以除錯的副作用至關重要。本文透過範例解析參考賦值的觸發時機與複製行為(Copy-on-Write)。
<?php
$foo = 'Bob';
$bar = &$foo; // $bar 成為 $foo 的別名
echo $foo . '<br/>'; // Bob
$bar = "My name is $bar"; // 修改 $bar
echo $bar . '<br/>'; // My name is Bob
echo $foo . '<br/>'; // My name is Bob($foo 同步變更)
?>
關鍵點:參考建立後的賦值操作會影響原始變數;參考建立前的賦值則不會。
$a = 'text'; $b = $a; → 兩變數指向同一 zval,refcount=2,is_ref=0。$c = &$a; → 必須將 $a 標記為 is_ref=1,為避免影響 $b,Zend 引擎立即複製一份給 $b(此時 $b 獨立,$a/$c 共享新副本)。因此:只要出現參考,即使尚未寫入,也會觸發一次複製,以維護非參考變數的獨立性。
&(如 function(&$arr))。foreach ($arr as &$v) 循環後務必 unset($v),避免 $v 保留參考汙染後續邏輯。readonly 與參考readonly 屬性初始化後不可修改,若嘗試建立參考並透過參考修改,會拋出 Error。這在領域模型中可作為防禦性設計手段。