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

PHP 數組傳值機制深度解析:為什麼說 PHP 數組是「值傳遞」而非引用

     編輯:PHP 綜合知識

核心結論

PHP 中數組預設為值傳遞(Copy-on-Write 機制)。 函數參數接收數組時,實際上是複製了一份 zval 結構體,但底層數據指向同一個 HashTable。只有發生寫入操作時,才會觸發真正的內存複製(分離)。這與 C/C++ 指針、JavaScript 物件引用有本質區別。

代碼驗證

<?php
$arr = ['name' => 'corn', 'age' => '24'];

function test_arr($arr) {
    $arr['name'] = 'qqyumidi'; // 修改副本
}

test_arr($arr);
print_r($arr); 
// 輸出:Array ( [name] => corn [age] => 24 ) 原數組未變

對比:JavaScript 物件引用傳遞

// JavaScript
let arr = ['corn', '24'];
function test_arr(arr) {
    arr[0] = 'qqyumidi'; // 修改原物件
}
test_arr(arr);
console.log(arr); // ["qqyumidi", "24"] 原陣列被修改

底層機制:Copy-on-Write (COW)

PHP 7+ 使用 zval 結構體管理變數:

  • 讀取時:共享同一個 HashTable,引用計數 +1,極高效
  • 寫入時:檢測引用計數 > 1,自動複製 HashTable(分離),修改副本
  • 引用傳遞(&):強制共享同一 zval,修改直接影響原變數

強制引用傳遞

function test_ref(&$arr) {
    $arr['name'] = 'qqyumidi'; // 直接修改原數組
}

$arr = ['name' => 'corn'];
test_ref($arr);
print_r($arr); // Array ( [name] => qqyumidi )

效能影響分析

場景內存行為效能
只讀傳遞大數組共享內存,無複製極快,O(1)
函數內修改元素觸發分離,複製整個 HashTableO(n),大數組有開銷
foreach 遍歷修改foreach 內部複製數組雙重內存佔用

最佳實踐建議

  1. 大數組只讀:直接值傳遞,效能最優
  2. 需修改原數組:使用 &$arr 明確聲明引用
  3. 避免在 foreach 中修改:改用 for 迴圈或先複製
  4. 返回新數組:函數內構建新數組返回,而非修改參數
  5. PHP 8.1+ readonly:配合類屬性實現不可變模式

常見誤區

❌ 「PHP 數組是引用傳遞」
✅ 正確:預設值傳遞,COW 機制使只讀極快,寫入才複製

❌ 「unset($arr) 會釋放內存」
✅ 正確:僅減少引用計數,內存由 GC 回收

總結

理解 PHP 數組的 COW 機制,能寫出高效能、無副作用的代碼。記住:預設值傳遞,需要引用時顯式加 &,大數組只讀零成本,寫入才分離。

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