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

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

它被弃用了吗?

【问题讨论】:

标签: php operators assignment-operator


【解决方案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

    没有一致/正确地展示:

    【讨论】:

    • @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
    

    【讨论】:

      猜你喜欢
      • 2011-12-12
      • 2013-07-07
      • 2015-11-06
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      相关资源
      最近更新 更多