PHP 引用讓「多個變數名稱指向同一個變數內容」(符號表條目指向同一 zval),不是 C 指標(存儲記憶體位址)。引用是「別名」,修改任一別名即修改共同內容。
$a = "ABC";
$b =& $a; // $b 成為 $a 的別名
$b = "EFG";
echo $a; // EFG($a 內容同步變更)
function add100(&$n) { $n += 100; }
$b = 1;
add100($b);
echo $b; // 101
// add100(1); // 錯誤:臨時值不可被引用
function &getStatic() {
static $b = 0;
return $b;
}
$a = getStatic(); // 普通賦值,複製值
$a = 5;
getStatic(); // 輸出 1(靜態變數未變)
$a =& getStatic(); // 引用回傳,$a 與靜態 $b 綁定
$a = 5;
getStatic(); // 輸出 6($b 被改為 5,下次遞增成 6)
規則:$a =& func() 才建立引用綁定;$a = func() 只是值拷貝。
class A { public $v = "ABC"; }
$b = new A;
$c = $b; // PHP 5 預設物件賦值即引用(複製 handle)
$b->v = "DEF";
echo $c->v; // DEF
// 若需深拷貝:$c = clone $b;
& 避免複製(寫時複製機制下唯讀其實不複製,但寫入時會觸發複製,引用可省去)。&。$var = null 解除引用關係,unset($var) 僅刪除別名不釋放內容。global $x 等同 $x =& $GLOBALS['x']。$this 永遠是呼叫物件的引用。PHP 內核對 zval 維護引用計數。$b = $a 只增加計數,不複製內存;直到任一變數寫入時,才分離複製。這是 PHP 高效能的關鍵,也解釋為何「唯讀傳大陣列不加 & 也快」。