【发布时间】:2010-12-18 14:35:57
【问题描述】:
=&(等号)赋值运算符在 PHP 中的作用是什么?
它被弃用了吗?
【问题讨论】:
-
另见stackoverflow.com/questions/3200009(标记为重复)
标签: php operators assignment-operator
=&(等号)赋值运算符在 PHP 中的作用是什么?
它被弃用了吗?
【问题讨论】:
标签: php operators assignment-operator
这是两个不同的运算符。 = 是您可能知道的分配。而& 表示变量应该通过引用而不是值来访问。
【讨论】:
它没有被弃用,也不太可能被弃用。这是一种标准方法,例如,将一个数组或对象的一部分更改为另一个,而不是复制现有数据。
它被称为引用分配,引用手册,"means that both variables end up pointing at the same data, and nothing is copied anywhere"。
唯一不推荐使用=& 的是在PHP 5 中“通过引用分配new 的结果”,这可能是任何混淆的根源。 new 是通过引用自动分配的,所以& 在$o = &new C; 中是多余的/已弃用,但在$o = &$c; 中不是。
由于很难搜索,请注意=&(等于和号)与= &(等于空格和号)相同,并且通常这样写它会遇到另一个变量,例如 $x = &$y['z']; 或 $x = &$someVar(与美元符号变量名称)。从文档简化的示例:
$a = 3;
$b = &$a;
$a = 4;
print "$b"; // prints 4
这是指向detailed section on Assign By Reference in the PHP manual 的便捷链接。该页面是参考系列的一部分 - 值得花一点时间阅读整个系列。
【讨论】:
$x = &$y['z'];
如果$y['z']不存在,也有创建null的效果。
这可以防止您可能想要阅读的错误消息。我还没有找到这方面的文档;据我所知,可能是 5.3 中的新功能。
【讨论】:
我想提请注意“Assigning By Reference”的语义和代码样式。 OP 的开场白暗示了一个误解:
=&(等号)赋值运算符在 PHP 中的作用是什么?
首先,让我们回顾一下PHP Docs page for Assignment Operators 的专用部分。请注意= 是如何出现在& 之前的,并且这两个符号是分开的。这是因为它们不是“组合运算符”。从语义上讲,它是“分配”一个“引用”;它不是“引用赋值运算符”。
其次,看看所有“组合运算符”是如何写在文档页面下方的。 = 始终是最右边的符号。这是一个非常重要的区别,因为在 = 左侧写入 & 会改变含义——它变成了组合运算符(“按位和赋值运算符”),而不是对引用的赋值。
PSR 编码标准应该是所有 PHP 开发人员都知道并努力遵守的标准。注意PSR-12 Section 6.2的这条规则:
所有二进制算术、比较、赋值、按位、逻辑、字符串和类型运算符必须前后至少有一个空格
根据这条规则,= 运算符之后应该始终有一个空格——这使得 =& 违规。
此外,还有其他规则规定& 与其变量/参数/函数/等之间不应有空格。
在参数前使用引用运算符 & 时,其后不得有空格
TL;DR
= 的两边加上空格,并且不要在 & 之后写空格。$a =& $b;
$a = &$b;
一致/正确地证明:https://riptutorial.com/php/example/11991/assign-by-reference
没有一致/正确地展示:
【讨论】:
& 不能用作通用运算符。该手册实际上有a section on Assignment by Reference,它确实拼写像一个=& 运算符和always has done。
$a = &$b,那么所有对$a 的赋值也会影响$b:$a = 42; $a = foo(); $a = $c; 等;如果$a = &$c; 是一个赋值,那么逻辑上它应该也影响$b,但它没有,它链接$a 和$c,并用$b。那是因为它不是“赋值”操作,而是“引用赋值”操作。
符号& 在PHP 中以多种方式使用,以表示带有“引用”的操作。 PHP 手册中有一个标题为 References Explained 的部分,每个 PHP 程序员都应该阅读。
了解 PHP 中的引用不是一种数据类型(如指针),而是一个关于变量如何工作的概念,这一点很重要。因此,& 没有单一的含义——你不应该把它理解为“做一个参考”——它只是意味着“这里发生了一些参考”。
特别是语法$a =& $b,也可以写成$a = &$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
您还可以将两个以上的变量作为引用链接在一起,同样,您在赋值右侧使用哪个现有名称并不重要:
$a =& $b;
$c =& $b;
$d =& $a;
$e =& $c;
// $a, $b, $c, $d, and $e now all point to the same data, interchangeably
但是,如果您将相同的变量放在左侧,它会破坏该变量的现有链接,并将其链接到其他东西: p>
$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
要“断开”链接而不创建新链接,您可以使用the unset keyword:
$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
【讨论】: