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

Rus*_*lex 11 php arrays variable-assignment

可能重复:
php中的数组是按值传递还是按引用传递?

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

PHP总是通过复制值将数组赋值给变量,如手册中所述.

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

<?php $a = array(1,2,3); ?>
Run Code Online (Sandbox Code Playgroud)

Mic*_*ski 20

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

// 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
)
Run Code Online (Sandbox Code Playgroud)


Dav*_*dom 13

除非您引用已存在的内容,否则无法通过引用分配内容.同样,你不能复制不存在的东西.

所以这段代码:

$a = array(1,2,3);
Run Code Online (Sandbox Code Playgroud)

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

但是,这段代码:

$x = 1;
$y = 2;
$z = 3;
$a = array($x,$y,$z);
Run Code Online (Sandbox Code Playgroud)

...副本从值$x,$y以及$z到一个数组1.用于初始化数组值的变量仍然存在,并且可以修改或销毁,而不会影响数组中的值.

这段代码:

$x = 1;
$y = 2;
$z = 3;
$a = array(&$x,&$y,&$z);
Run Code Online (Sandbox Code Playgroud)

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

有关PHP中参考工作方式的更多信息,请参阅手册的这一部分.


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