通过引用分配php传递


Passing by reference assignment php

本问题已经有最佳答案,请猛点这里访问。

根据下面的PHP代码,输出为

1
2
3
1 . 1
2 . 2
3 . 3

我理解&;$ref是通过引用传递的。但就像在赋值之后($row=&;$ref;)无论何时"row"更改值,"ref"也会更改为与"row"相同的值。真令人困惑。似乎=不仅将右值赋给左值。有人能核实一下吗?

1
2
3
4
5
6
7
8
9
<?php
$ref = 0;
$row = &$ref;
foreach (array(1, 2, 3) as $row) {
    print"$row . $ref
"
;
}
echo $ref;
?>


当你这样做的时候

它的意思是:相同的变量内容有另一个名称。那是,同样的,不是复制品。你在$ref里做的,会在$row里做的……反之亦然。


在不深入研究技术细节的情况下,这里的基本思想是,您已经将$ref作为$row的参考。具体来说,$row位于某个内存地址。如果你做一个简单的作业

1
$ref = $row;

那么,$ref$row的副本。如果你换一个,另一个就不会变了

1
$row = &$ref;

$ref现在指向$row。所以它们本质上是相同的变量。它们指向同一个内存位置(过于简单化,因此您得到了这个想法)。

最常见的用法是需要向函数中注入一些值。

1
2
3
4
5
6
7
$data = ['1', '2', '3'];

function modVal(Array &$arr) {
    $arr[2] = '9';
}
modVal($data);
var_dump($data);

生产

1
2
3
4
5
6
7
8
array(3) {
  [0]=>
  string(1)"1"
  [1]=>
  string(1)"2"
  [2]=>
  string(1)"9"
}

但是,从函数声明中删除&,输出变为

1
2
3
4
5
6
7
8
array(3) {
  [0]=>
  string(1)"1"
  [1]=>
  string(1)"2"
  [2]=>
  string(1)"3"
}

PHP有时会自动为您传递引用。例如,如果您实例化一个类并将该实例注入到一个函数中,它将自动通过引用传递。