提问人:Kyle J. Dye 提问时间:11/20/2009 最后编辑:Peter MortensenKyle J. Dye 更新时间:8/14/2022 访问量:53112
PHP 中的引用赋值运算符,=&
Reference assignment operator in PHP, =&
答:
这是两个不同的运算符。 正如您可能知道的那样,是任务。并且意味着应通过引用而不是值访问变量。=
&
评论
它没有被弃用,也不太可能被弃用。例如,这是将一个数组或对象镜像的一部分更改到另一个数组或对象的一部分的标准方法,而不是复制现有数据。
它被称为引用赋值,引用手册的话来说,“这意味着两个变量最终都指向相同的数据,并且不会在任何地方复制任何内容”。
唯一被弃用的是 PHP 5 中的“通过引用分配结果”,这可能是任何混淆的根源。 通过引用自动分配,因此在 中是冗余/弃用的,但在 中不是。=&
new
new
&
$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手册中关于按引用分配的详细部分。该页面是参考文献系列的一部分 - 值得花一分钟阅读整个系列。
评论
$x = &$y['z'];
还具有创建(如果它不存在)的效果,并将其设置为 。$y['z']
null
这样可以防止您可能想要阅读的错误消息。我还没有找到这方面的文档;据我所知,可能是 5.3 中的新功能。
评论
我想提请大家注意“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
未始终如一/正确地证明:
- 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;
评论
&
=&
$a = &$b
$a = 42; $a = foo(); $a = $c;
$a = &$c;
该符号在 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)
评论