首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

深度解析 PHP 引用(& 符號)機制與應用場景

     編輯:PHP 相關知識

核心概念:引用 ≠ 指標

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() 只是值拷貝。

物件引用(PHP 5+)

class A { public $v = "ABC"; }
$b = new A;
$c = $b;        // PHP 5 預設物件賦值即引用(複製 handle)
$b->v = "DEF";
echo $c->v; // DEF

// 若需深拷貝:$c = clone $b;

效能建議

  • 大型陣列/字串傳遞給函數時,用 & 避免複製(寫時複製機制下唯讀其實不複製,但寫入時會觸發複製,引用可省去)。
  • 物件預設傳遞 handle,無需加 &。
  • 手動清理:$var = null 解除引用關係,unset($var) 僅刪除別名不釋放內容。

特殊引用

  • global $x 等同 $x =& $GLOBALS['x']。
  • $this 永遠是呼叫物件的引用。

寫時複製(Copy-on-Write)底層機制

PHP 內核對 zval 維護引用計數。$b = $a 只增加計數,不複製內存;直到任一變數寫入時,才分離複製。這是 PHP 高效能的關鍵,也解釋為何「唯讀傳大陣列不加 & 也快」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved