php数组通过复制值或引用分配? [复制]

Posted

技术标签:

【中文标题】php数组通过复制值或引用分配? [复制]【英文标题】:php array assign by copying value or by reference? [duplicate] 【发布时间】:2012-02-12 10:35:28 【问题描述】:

可能重复:are arrays in php passed by value or by reference?

听说 PHP 可以选择如何分配数组,取决于数组的大小。 它可以通过复制值(作为任何标量类型)或通过引用来分配。

PHP 总是通过复制一个值来将数组分配给变量,正如它在手册中所说的那样。

或者它可以通过引用分配。 ?

<?php $a = array(1,2,3); ?>

【问题讨论】:

您是否只是想知道是否可以通过引用分配数组?或者您想知道是否有某种方法可以将其设置为自动执行此操作? 我想知道,有时 PHp 引擎可以通过 $a = array(1,2,3); $b = $a;通过引用不带“&”符号。 【参考方案1】:

在将数组变量分配给其他变量时,可以通过引用分配数组:

// By value...
$a = array(1,2,3);
$b = $a;
array_push($a, 5);
print_r($b);

// $b is not a reference to $a
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

// By Reference
$a = array(1,2,3);
$b = &$a; // Here we assign by reference
array_push($a, 5);
print_r($b);

// $b is a reference to $a and gets the new value (3 => 5)
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 5
)

【讨论】:

【参考方案2】:

你不能通过引用来赋值,除非你引用了已经存在的东西。同样,你不能复制不存在的东西。

所以这段代码:

$a = array(1,2,3);

...既不复制也不引用 - 它只是创建一个新的数组,用值填充它,因为值是按字面指定的。

但是,这段代码:

$x = 1;
$y = 2;
$z = 3;
$a = array($x,$y,$z);

...将$x$y$z 中的值复制到一个数组中1。用于初始化数组值的变量本身仍然存在,可以修改或销毁而不影响数组中的值。

这段代码:

$x = 1;
$y = 2;
$z = 3;
$a = array(&$x,&$y,&$z);

...创建对$x$y$z 的引用数组(注意&amp;)。如果在运行此代码后,我修改了$x - 假设我给它一个值 4 - 它也会修改数组中的第一个值。因此,当您使用数组时,$a[0] 现在将包含4

请参阅手册的this section,了解有关参考如何在 PHP 中工作的更多信息。


1根据用作数组成员的变量的类型和值,即使按值赋值,也可能不会在赋值时发生复制操作。出于性能和内存效率的原因,PHP 在内部尽可能多地使用写时复制。但是,就代码上下文中的行为而言,您可以将其视为简单副本。

【讨论】:

【参考方案3】:

是的,使用&amp;

$a = array(&$b, &$c, &$d);

【讨论】:

以上是关于php数组通过复制值或引用分配? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

通过对象引用行为修改 PHP 数组:是保证还是随机? [复制]

php按值复制数组元素,而不是按引用

PHP 中的数组是作为值复制还是作为对新变量的引用,以及何时传递给函数?

如何将命名键分配给数组? [复制]

PHP:为啥用括号括起来的函数调用会阻止“通过引用”通知? [复制]

PHP 内存管理 写时复制 垃圾回收