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 中的引用赋值运算符 =&的主要内容,如果未能解决你的问题,请参考以下文章