萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 變量作用域、引用機制、對象引用與傳遞全解析

變量作用域

  • 全域變量:腳本全域有效,include/require 引入文件亦可見。函數內需用 global $var 或 $GLOBALS['var'] 訪問。
  • 局部變量:函數內部聲明,僅函數內有效。
  • 靜態變量:static $var,函數調用間保持值不銷毀。

引用:同一內容,不同名字

$b = &$a 使 $a、$b 指向同一記憶體內容(非 C 指標)。修改任一變量,另一同步變化。
函數傳址調用:function test(&$a),實參必須為變量(不可為常量/表達式)。
函數引用返回:function &test(),調用時 $a = &test() 獲取引用,修改 $a 影響函數內靜態變量。

對象引用(PHP 5+ 默認行為)

PHP 5 起,$obj2 = $obj1 為引用賦值(等同 $obj2 = &$obj1),修改屬性相互影響。需獨立副本請用 clone 並可選實作 __clone() 魔術方法調整副本屬性。

class A { public $abc = "ABC"; }
$b = new A; $c = $b; $d = clone $b;
$b->abc = "DEF";
echo $c->abc; // DEF (引用)
echo $d->abc; // ABC (獨立副本)

引用最佳實踐與銷毀

  • 大型陣列/對象傳遞建議用引用 & 節省記憶體。
  • unset($ref) 僅斷開變量名與內容綁定,不銷毀內容(其他引用仍有效)。
  • global $var 實為建立到 $GLOBALS['var'] 的引用。
  • $this 永遠是調用對象的引用。

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

Zend 引擎實現:$b = $a 最初指向同一記憶體;只有發生寫入操作(如 $a = "new")時,才為 $b 分配新記憶體並複製數據。這解釋了 foreach 唯讀極快、寫入較慢的原因。

copyright © 萬盛學電腦網 all rights reserved