当前位置: 首页> 最新文章列表> 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 是值复制的,不会共享引用。

通过理解这些底层机制,你可以更精确地控制数组的行为,提高代码的健壮性与可维护性。