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

Posted

技术标签:

【中文标题】PHP 中的引用赋值运算符 =&【英文标题】:Reference assignment operator in PHP, =& 【发布时间】:2010-12-18 14:35:57 【问题描述】:

=&(等号)赋值运算符在 php 中的作用是什么?

它被弃用了吗?

【问题讨论】:

另见***.com/questions/3200009(标记为重复) 【参考方案1】:

这是两个不同的运算符。 = 是您可能知道的分配。而& 表示变量应该通过引用而不是值来访问。

【讨论】:

对不起,这太简单了。 $a =& $b 意味着使变量 $a 引用与 $b 现在所做的相同的事情。在此之后,$a = 5;也会导致 $b 的值为 5。但是参考链接可能会被 $b =& $xyz; 破坏。或未设置($b);届时,$a 将是唯一知道包含 5 的单元格在哪里的变量。另外请注意,如果您使用 =& 设置 $a,则下次必须使用 =&(或 unset($a))来更改$a 的参考链接,具体为 $a = NULL;不会断开链接,它只会将 5 替换为 null; @Don:感谢您的详细说明。我可以告诉你你是一个 C 程序员 我赞同唐所说的。但我不会说这太简单了。我会说这是错误的。 @Don,你真的应该发表你的评论作为答案。 我同意 Artefacto,这个答案是错误的,并且具有误导性。 PHP中没有“通过引用访问变量”这样的东西,引用赋值不是和普通赋值一样的操作。我知道你写这个答案是很久以前的了,但可以看到你仍然活跃,所以请你用更有经验的眼睛看看这个答案,如果你同意它,可以考虑编辑或删除它不正确。【参考方案2】:

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

它被称为引用分配,引用手册,"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 的便捷链接。该页面是参考系列的一部分 - 值得花一点时间阅读整个系列。

【讨论】:

附注回复:“因为很难搜索”:symbolhound.com 是你的朋友。【参考方案3】:
$x = &$y['z'];

如果$y['z']不存在,也有创建null的效果。

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

【讨论】:

【参考方案4】:

我想提请注意“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

没有一致/正确地展示:

https://www.php.net/manual/en/language.references.whatdo.php#:~:text=$a%20=%26%20$b; https://www.php.net/manual/en/language.references.whatdo.php#:~:text=$foo%20=%26%20find_var($bar); https://www.php.net/manual/en/language.oop5.basic.php#:~:text=$reference%20%20=%26%20$instance;

【讨论】:

@LucidKit 我无法对建议的编辑拒绝发表评论。我拒绝更改超链接,因为原始链接有效,我认为更改它没有任何好处。我也不想用一个显示了适当语法的网页链接列表来膨胀我的答案——一个足以证明我的观点,我随机选择这个(我与那个网站没有任何关系)。 经过仔细检查,您很可能是该网站的管理员,因为链接页面是在几分钟前编辑的,并且管理员用户是 13 天前在该网站上创建的。这使您看起来像是在尝试通过我的回答来宣传您的内容,这真的鼓励我拒绝您的编辑并在 Stack Exchange 的其他地方跟踪您的编辑以获取更多未公开的隶属关系。 我认为您对编码风格的了解太多了,人们可能根本没有考虑过这个问题。现实情况是,在 PHP 中,引用赋值 一种特定操作,而 & 不能用作通用运算符。该手册实际上有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。那是因为它不是“赋值”操作,而是“引用赋值”操作。【参考方案5】:

符号& 在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

【讨论】:

以上是关于PHP 中的引用赋值运算符 =&的主要内容,如果未能解决你的问题,请参考以下文章

引用运算符的PHP赋值不通过函数工作

PHP的运算符

C++中的重载赋值运算符

为啥移动赋值运算符应该返回对 *this 的引用 [重复]

赋值运算符的参数必须是引用吗?

PHP赋值运算符=& [重复]