=&
(等于&符号)赋值运算符在PHP中做什么?
是否已弃用?
答案 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