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

PHP 參考(&)使用深度解析:寫時複製機制、效能陷阱與正確應用場景

     編輯:PHP 綜合知識

核心觀念:PHP 參考 ≠ C 指標

  • C 指標需顯式 * 定義,記憶體位址由程式設計師控制。
  • PHP 參考由 Zend 引擎自動管理,採用 Copy-on-Write(寫時複製) 機制。

寫時複製示範

$a = array('a','c','n');
$b = $a; // 此時 $a、$b 指向同一記憶體區塊,未複製

function printArray(&$arr) { // 參考傳遞
    print(count($arr));
}
printArray($a); // Zend 偵測到可能修改,為 $b 複製一份 $a 的資料

若改為值傳遞 function printArray($arr),則不觸發複製,效能更好。

效能實測

循環 1000 次呼叫,參考傳遞比值傳遞 慢 30% 以上,因頻繁觸發記憶體分配與複製。

正確使用場景

  1. 需修改原變數:function swap(&$a, &$b) { $t=$a; $a=$b; $b=$t; }
  2. 大型資料結構避免複製:僅讀取時不要加 &,Zend 已自動優化;需修改時才加。
  3. 物件傳遞:PHP 5+ 物件預設為 handle 傳遞(類似參考),無需加 &。
  4. foreach ($arr as &$v) 修改陣列元素值,結束後建議 unset($v) 解除參考。

常見錯誤

  • 誤以為加 & 就能提升效能,實則相反。
  • 函數回傳參考 function &getRef() 使用不當導致難以追蹤的 Bug。
  • 舊版 PHP new Class() 回傳值而非參考,需 $obj = & new Class()(PHP 5+ 已修正)。

最佳實踐原則

  1. 預設不使用參考,讓 Zend 引擎自動優化。
  2. 只有在確定需要修改原變數時才加 &。
  3. 大型陣列/字串唯讀傳遞時,絕不加 &。
  4. 定期 profiling(Xdebug/XHProf)驗證參考使用是否真有收益。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved