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

时间:2009-11-20 04:28:52

标签: php operators assignment-operator

=&(等于&符号)赋值运算符在PHP中做什么?

是否已弃用?

5 个答案:

答案 0 :(得分:102)

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

它被称为按引用分配,引用手册"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 &符号美元符号变量名称)。从文档中简化的示例:

{{1}}

这是detailed section on Assign By Reference in the PHP manual的便捷链接。该页面是参考系列的一部分 - 值得花一点时间阅读整个系列。

答案 1 :(得分:24)

这是两个不同的运营商。 =是您可能知道的任务。 &表示变量应该通过引用而不是值来访问。

答案 2 :(得分:5)

$x = &$y['z'];
如果$y['z']不存在,

也会产生效果,并将其设置为null

这可以防止您可能想要阅读的错误消息。我还没有找到关于此的文件;据我所知,可能是5.3中的新内容。

答案 3 :(得分:0)

我想提请注意“按引用分配”的语义和代码样式。 OP的开场白暗示了一种误解:

=&(等于和号)赋值运算符在PHP中做什么?

首先,让我们回顾一下PHP Docs page for Assignment Operators的专用部分。请注意loss=之前是如何出现的,并且两个符号是分开的。这是因为它们不是“ 组合运算符”。从语义上讲,它是“分配”一个“引用”。它不是“引用赋值运算符”。

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

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

所有二进制算术运算,比较,赋值,按位运算,逻辑运算,字符串运算和类型运算符都必须在其前后加上至少一个空格

根据此规则,=运算符后应始终有一个空格-这会使=违反规范。

此外,还有其他规则指出=&及其变量/参数/函数/等之间不应有空格。

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


TL; DR

分配引用时,请始终在&的两边都写上空格,并且切勿在{{1​​}}之后写上空格。

  • 错误:=
  • 好:&

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

无法一致/正确地显示:

答案 4 :(得分:0)

符号 & 在 PHP 中以多种方式用于表示带有“引用”的操作。 PHP 手册有一个标题为 References Explained 的部分,每个 PHP 程序员都应该阅读。

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

特别是语法$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

但是,如果您将相同的变量放在左侧,它会断开该变量的现有链接,并将其链接到其他内容: >

$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