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

Reference assignment operator in PHP, =&

提问人:Kyle J. Dye 提问时间:11/20/2009 最后编辑:Peter MortensenKyle J. Dye 更新时间:8/14/2022 访问量:53112

问:

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

它已弃用吗?

php 运算符 assignment-operator

评论

1赞 Artefacto 7/8/2010
另请参阅 stackoverflow.com/questions/3200009(标记为重复)

答:

26赞 Asaph 11/20/2009 #1

这是两个不同的运算符。 正如您可能知道的那样,是任务。并且意味着应通过引用而不是值访问变量。=&

评论

65赞 Don 4/7/2010
对不起,这太简单了。$a =& $b 意味着使变量$a引用$b现在所做的相同事情。在此之后,$a = 5;也会导致$b获得 5。但是,引用链接可能会被 $b =& $xyz;或 unset($b);此时$a将是唯一知道保存 5 的单元格在哪里的变量。还要注意的是,如果使用 =& 设置$a,则下次必须使用 =&(或 unset($a))来更改$a的引用链接,特别是 $a = NULL;不会断开链接,只会用 null 替换 5;
8赞 Asaph 4/7/2010
@Don:谢谢你的阐述。我看得出来你是一个C程序员。
9赞 Artefacto 8/22/2010
我赞同唐说的话。但我不会说这太简单了。我会说这是错误的。
0赞 Adam 1/4/2019
@Don你真的应该把你的评论作为答案。
0赞 IMSoP 4/8/2021
我同意 Artefacto 的观点,这个答案是错误的,并且具有误导性。PHP中没有“通过引用访问变量”这样的东西,通过引用进行赋值与普通赋值不是相同的操作。我意识到你很久以前写了这个答案,但可以看到你仍然活跃,所以请你用更有经验的眼睛看看这个答案,如果你同意它不正确,可以考虑编辑或删除它。
151赞 user56reinstatemonica8 11/18/2011 #2

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

它被称为引用赋值,引用手册的话来说,“这意味着两个变量最终都指向相同的数据,并且不会在任何地方复制任何内容”。

唯一被弃用的是 PHP 5 中的“通过引用分配结果”,这可能是任何混淆的根源。 通过引用自动分配,因此在 中是冗余/弃用的,但在 中不是。=&newnew&$o = &new C;$o = &$c;


由于很难搜索,请注意 (equals &ersand) 与 (equals space & and) 相同,并且通常写成这样,它会遇到另一个变量,如 or(&符号美元符号变量名称)。文档中简化的示例:=&= &$x = &$y['z'];$x = &$someVar

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

这里有一个方便的链接,指向PHP手册中关于按引用分配的详细部分。该页面是参考文献系列的一部分 - 值得花一分钟阅读整个系列。

评论

8赞 But those new buttons though.. 12/14/2016
旁注:“因为很难搜索”symbolhound.com 是你的朋友。
7赞 malcanso 9/24/2013 #3
$x = &$y['z'];

还具有创建(如果它不存在)的效果,并将其设置为 。$y['z']null

这样可以防止您可能想要阅读的错误消息。我还没有找到这方面的文档;据我所知,可能是 5.3 中的新功能。

评论

0赞 IMSoP 6/28/2022
值得一提的是,这种行为至少早在 PHP 4.3 中就存在了 3v4l.org/3g2WZ 它有时被称为“自动复活”,但我不知道手册中的哪个位置详细描述了它。
1赞 mickmackusa 9/16/2020 #4

我想提请大家注意“Asassignment By Reference”的语义和代码样式。OP的开场白暗示了一个误解:

=&(等于&)赋值运算符在PHP中有什么作用?

首先,让我们回顾一下 PHP Docs 页面中 Assignment Operators 的专用部分。请注意 和 之前的两个符号是如何分开的。这是因为它们不是“组合运算符”。从语义上讲,它是“分配”一个“参考”;它不是“引用赋值运算符”。=&

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

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

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

根据这条规则,运算符后面应该始终有一个空格 -- 这违反了。==&

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

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


TL的;博士

分配引用时,始终在两边都写有空格,切勿在 之后写空格。=&

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

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

未始终如一/正确地证明:

评论

0赞 mickmackusa 11/19/2020
@LucidKit我无法对我建议的编辑拒绝发表评论。我拒绝了超链接的更改,因为原始链接有效,我认为更改它没有任何好处。我也不想用一个网页链接列表来膨胀我的答案,其中有适当的语法 - 一个足以证明我的观点,我随机选择这个(我与该网站没有隶属关系)。
0赞 mickmackusa 11/19/2020
经过仔细检查,您很可能是该网站的管理员,因为链接页面仅在几分钟前被编辑,而管理员用户是在 13 天前在该网站上创建的。这使您看起来像是试图通过我的答案来宣传您的内容,这确实鼓励我拒绝您的编辑并跟踪您在 Stack Exchange 中其他地方的编辑,以获得更多未公开的隶属关系。
0赞 IMSoP 4/7/2021
我认为你对编码风格读得太多了,人们可能根本没有考虑过这个问题。现实情况是,在 PHP 中,通过引用赋值是一种特定的操作,并且不能作为通用运算符使用。该手册实际上有一个关于“按引用分配”的部分,它确实像一个运算符一样拼写它,并且一直如此&=&
0赞 mickmackusa 4/8/2021
仅仅因为某件事总是以某种方式完成,并不意味着它是正确的方式或最好的方式。
3赞 IMSoP 4/8/2021
不管对空格的看法如何,这个答案的前提是积极的误导:引用赋值不能被分析为赋值加引用,它是一种不同的操作。如果将所有赋值设置为$a也会影响$b:等;如果是赋值,那么从逻辑上讲,它也应该影响$b,但事实并非如此,它将$a和$c联系起来,并断开与$b的链接。这是因为它不是“赋值”操作,而是“引用赋值”操作。$a = &$b$a = 42; $a = foo(); $a = $c;$a = &$c;
6赞 IMSoP 4/11/2021 #5

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

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

特别是,也可以编写的语法表示引用赋值。它将两个变量绑定在一起,以便它们都指向同一条数据。将 视为修改 而不是修改 .$a =& $b$a = &$b&=$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

要在不创建新链接的情况下“断开”链接,您可以使用 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)