當前位置: 首頁> 最新文章列表> array_fill() 填充的值是引用還是複制?

array_fill() 填充的值是引用還是複制?

M66 2025-06-05

在PHP 編程中, array_fill()是一個非常實用的函數,用於創建並填充一個數組。它的函數簽名如下:

 array array_fill(int $start_index, int $count, mixed $value)

該函數的作用是在指定的起始索引位置開始,創建一個包含$count個元素的數組,並用相同的$value進行填充。一個常見的問題是:這個$value是按值複製到數組中的,還是按引用傳遞?

填充值的行為:按值複製

array_fill()函數默認是按值複製進行填充的。也就是說,如果你填充的是一個對像或者數組的引用,每一個元素在array_fill()中都將是一個獨立的拷貝,而不是多個元素共享同一個引用。

來看一個例子:

 $obj = new stdClass();
$obj->name = "Alice";

$filled = array_fill(0, 3, $obj);
$filled[0]->name = "Bob";

echo $filled[1]->name; // 輸出 "Bob"

你會發現,儘管array_fill()是按值傳遞的,但對像是以引用語義存在的,因此數組中每一項都指向同一個對象。當你修改其中一個對象的屬性,其他項也會受到影響。

但如果填充的是一個普通的數據類型,比如整數或字符串,那麼每一個數組元素都是獨立的值:

 $filled = array_fill(0, 3, "Hello");
$filled[0] = "World";

print_r($filled);
// 輸出:
// Array
// (
//     [0] => World
//     [1] => Hello
//     [2] => Hello
// )

在這個例子中,修改$filled[0]不會影響其他元素,說明字符串是按值複製的。

如何按引用填充?

如果你希望每一個數組元素都引用同一個變量,而不僅僅是值的拷貝,你可以使用array_fill()配合引用變量。示例如下:

 $value = "shared";
$filled = array_fill(0, 3, &$value);

$value = "updated";
print_r($filled);
// 輸出:
// Array
// (
//     [0] => updated
//     [1] => updated
//     [2] => updated
// )

在這個例子中,使用&$value明確指定為引用,數組中的每一個元素都綁定到同一個變量$value 。任何對$value的更改都會同步反映到數組中的每一項。

但要注意,這種方式在PHP 中並不常見,也容易引發意料之外的行為。通常,只有在確實需要多個數組項共享同一個引用的情況下,才建議使用。

總結

  • array_fill()默認行為是按值複製

  • 如果$value是對像或數組,複製的其實是引用(因為對像在PHP 中總是以引用方式傳遞)。

  • 可以使用&$value強制傳引用,以實現真正的共享引用。

  • 使用引用應謹慎,避免引發難以調試的問題。

正確理解array_fill()的填充機制,有助於在實際項目中避免潛在的邏輯錯誤。如果你正在開發類似緩存初始化、佔位符結構、批量配置的功能模塊,掌握這些差異尤為重要。

例如:

 $placeholders = array_fill(0, 10, "http://m66.net/placeholder");

上述代碼將填充一個包含10 個固定URL 的數組,這些URL 是值複製的,不會共享引用。

通過理解這些底層機制,你可以更精確地控制數組的行為,提高代碼的健壯性與可維護性。