PHP 中的引用赋值运算符,= &

=&(equals-ampersand)赋值操作符在 PHP 中是做什么的?

它已经废弃了吗?

49843 次浏览

It's two different operators. = is assignment as you probably know. And & means the variable should be accessed by reference rather than by value.

它没有被废弃,也不太可能被废弃。例如,这是对一个数组或对象镜像进行部分更改而不是复制现有数据的标准方法。

它叫 参考转让引用说明书的话,就是 “意味着两个变量最终指向同一个数据,没有任何东西被复制到任何地方”

不赞成使用 =&的唯一一件事是在 PHP5中“通过引用分配 new的结果”,这可能是任何混淆的来源。new是通过引用自动分配的,所以 &$o = &new C;中是冗余的/不推荐的,但在 $o = &$c;中不是。


Since it's hard to search, note that =& (等于 & 符号) is the same as = & (等于空间 & 符号) and is often written such that it runs into the other variable like $x = &$y['z']; or $x = &$someVar (& 符号和美元符号变量名). Example simplified from the docs:

$a = 3;
$b = &$a;
$a = 4;
print "$b"; // prints 4

这里有一个方便的链接到 PHP 手册中关于 < strong > Assign By Reference 的详细部分。这一页是参考文献系列的一部分,值得花一分钟来阅读整个系列。

$x = &$y['z'];

also has the effect of creating $y['z'] if it doesn't exist, and setting it to null.

这可以防止您可能希望读取的错误消息。我还没有找到这方面的文档; 据我所知,可能在5.3版本中是新的。

我想提请大家注意“通过引用分配”的语义和代码样式。《观察家报》的开篇暗示了一个误解:

在 PHP 中,= & (等于-&)赋值运算符是做什么的?

首先,让我们回顾一下 工作分配操作符的 PHP 文档页的专用部分。注意 =是如何出现在 &之前的,并且这两个符号是分开的。这是因为他们不是“ 组合运算符组合运算符”。从语义上讲,它是“赋值”一个“引用”; 它不是“引用赋值运算符”。

其次,看看所有的“组合运算符”是如何写在文档页面的下方的。=始终是最右边的符号。这是一个非常重要的区别,因为将 &写在 =的左边会改变其含义——它将成为一个组合运算符(“按位和赋值运算符”) ,而不是对引用的赋值。

PSR 编码标准应该是所有 PHP 开发人员都知道并努力遵守的。注意 PSR-12第6.2条的这条规则:

所有二进制算术、比较、赋值、按位、逻辑、字符串和类型运算符的前面和后面必须至少有一个空格

根据这个规则,在 =操作符之后应该始终有一个空格——这使得 =&成为一个冲突。

此外,还有其他规则规定,在 &和它的变量/参数/函数/等之间不应该有空格。

当在参数之前使用引用运算符时,参数之后不能有空格


DR

在分配引用时,始终在两边写有空格的 =,不要在 &之后写空格。

  • 坏: $a =& $b;
  • 好: $a = &$b;

一致/正确演示: https://riptutorial.com/php/example/11991/assign-by-reference

没有一致/正确地显示:

The symbol & is used in various ways in PHP to represent operations with "references". The PHP manual has a section titled 翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳 which every PHP programmer should read.

了解 PHP 中的引用不是数据类型(如指针) ,而是关于变量如何工作的概念,这一点很重要。因此,&没有单一的含义-你不应该把它理解为“作为参考”-它只是意味着“某些参考-y 正在这里发生”。

In particular, the syntax $a =& $b, which can also be written $a = &$b, represents 参考转让. It binds two variables together, so that they both point at the same piece of data. Think of the & as modifying the = rather than modifying the $b.

一旦你以这种方式将两个变量绑定在一起,它们就可以互换了——你不能说“ $a 指向 $b”或者“ $b 指向 $a”:

$a =& $b;
$a = 42;
// both $a and $b will be 42
$b = 101;
// both $a and $b will be 101

You can also link more than two variables together as references, and again it doesn't matter which of the existing names you use on the right-hand side of the assignment:

$a =& $b;
$c =& $b;
$d =& $a;
$e =& $c;
// $a, $b, $c, $d, and $e now all point to the same data, interchangeably

然而,如果你把相同的变量放在 left-hand这边,它就是 破坏了该变量的现有链接,并将其链接到其他东西:

$a =& $b;
// $a and $b are linked together


$a =& $c;
// $a is now linked to $c
// the value of $b doesn't change, but it is not linked to $a or $c

要“断开”链接而不创建新链接,可以使用 unset关键字:

$a =& $b;
$c =& $a;
// $a, $b, and $c are all linked together
unset($a);
// $b and $c are still linked together, but $a is independent

一些描述将 =&称为“创建或添加引用集”。如果将它实现为一个函数(如 bind($a, $b)) ,以突出显示这两个参数都受操作的影响,那么效果可能会更好。