在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 是值複製的,不會共享引用。
通過理解這些底層機制,你可以更精確地控制數組的行為,提高代碼的健壯性與可維護性。