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

PHP 參考賦值機制詳解:變數別名如何影響原始值

     編輯:PHP 綜合知識

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 同步變更)
?>

關鍵點:參考建立後的賦值操作會影響原始變數;參考建立前的賦值則不會。

內部機制:Copy-on-Write (COW)

  • $a = 'text'; $b = $a; → 兩變數指向同一 zval,refcount=2,is_ref=0。
  • $c = &$a; → 必須將 $a 標記為 is_ref=1,為避免影響 $b,Zend 引擎立即複製一份給 $b(此時 $b 獨立,$a/$c 共享新副本)。

因此:只要出現參考,即使尚未寫入,也會觸發一次複製,以維護非參考變數的獨立性。

實務建議

  1. 函式參數預設傳值,需修改外部變數時才加 &(如 function(&$arr))。
  2. foreach ($arr as &$v) 循環後務必 unset($v),避免 $v 保留參考汙染後續邏輯。
  3. 大型陣列/物件頻繁參考傳遞會增加記憶體複製開銷,評估是否改用物件(預設傳遞物件識別符)或單向資料流。

進階:PHP 8.1+ readonly 與參考

readonly 屬性初始化後不可修改,若嘗試建立參考並透過參考修改,會拋出 Error。這在領域模型中可作為防禦性設計手段。

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