PHP 中的引用赋值运算符 ( =& ) 与通过引用传递 ( &$var ) 相结合

Reference assignment operator ( =& ) combined with passed by reference ( &$var ) in PHP

提问人:Artem Stepin 提问时间:1/17/2022 更新时间:1/17/2022 访问量:45

问:

为什么当使用引用进行赋值时,通过引用传递的变量不更改?

function foo(&$x) {
    $y = 1;
    $x = &$y;
}
$bar = 0;
foo($bar);
echo $bar; //why is this not 1?

此行为在所有 PHP 版本中似乎都是相同的。因此,我假设该行为是设计使然。

是否有记录表明在这种情况下引用丢失了?

PHP 变量 按引用传递

评论

0赞 deceze 1/17/2022
$x = &$y引用了 。这打破了之前的引用。你还希望它做什么?将引用分配给引用?这会表现出什么行为?$x$y
0赞 u_mulder 1/17/2022
当函数结束时,也会超出范围。那么应该参考什么呢?无?$y$bar
0赞 Artem Stepin 1/17/2022
@deceze 我希望通过引用 ($x) 传递的变量现在将获得对新变量 ($y) 的引用,就像赋值运算符通常工作的那样。
1赞 deceze 1/17/2022
=&不过,它不是赋值运算符,而是“make this a reference to that”运算符,粗略地说。如果“this”以前已经是一个引用,那么它现在被另一个引用所取代。
0赞 Artem Stepin 1/17/2022
@u_mulder 如果$y是全局值,也会发生同样的情况。3v4l.org/hf8Pg

答:

1赞 deceze 1/17/2022 #1

PHP 中的引用是一种通过不同名称访问相同变量内容的方法。它们不像 C 指针;例如,您不能使用它们执行指针算术,它们不是实际的内存地址,等等。[..]相反,它们是符号表别名。请注意,在 PHP 中,变量名称和变量内容是不同的,因此相同的内容可以有不同的名称。最接近的类比是 Unix 文件名和文件 - 变量名称是目录条目,而变量内容是文件本身。引用可以比作 Unix 文件系统中的硬链接。

什么是参考文献

<?php
$a =& $b;
?>

它的意思是并指向相同的内容。$a$b

注意:
在这里是完全相等的。 不指向,反之亦然。 并指向同一个地方。
$a$b$a$b$a$b

参考资料的作用

因此,$x $y指向的值的别名。如果以前是某个值的别名,那么现在已经损坏了,因为它一次只能指向一个值。$x = &$y;$x

但是,您可以破坏通过引用传递的关系,这感觉是错误的。

好吧,这完全取决于你。如果你了解引用是如何工作的,那么你就完全可以控制编写代码,使它们按照你的意愿工作。

0赞 Hh Lohmann 1/17/2022 #2

变量是分配给值的名称。您可以通过检索变量的值来传递或使用变量,然后使用该变量或变量的名称,以便以后引用它。按引用传递存在一个问题,即其他进程可能会在您使用变量时更改变量的值。如果按值传递,则为该值指定一个新名称,并且很有可能没有其他进程知道此名称并使用关联的值执行不需要的操作。

例如,不可能首先将“x”作为对“bar”的引用,然后将“x”作为对“y”的引用,然后期望名称“bar”成为“y”值的新名称。换句话说,你首先说“用 x 我的意思是 bar”,然后说“用 x 我的意思是 y”,然后说“给我分配给 bar 的值”。分配给“bar”的值应该在哪里更改?无非是

$bar = 0;
$x = &$bar;
$y = 1;
$x = &$y;
echo $bar; // 0

你对函数的期望是,通过将“bar”分配给“x”来显式地“重新建立”“x”和“bar”之间的关联:

$bar = 0;
$x = &$bar;
$y = 1;
$x = &$y;
$bar = &$x;
echo $bar; // 1

考虑你的有效是“函数 foo($x = &$bar)”(当然在形式上不可能说)。这清楚地表明你有两个竞争者,获胜的最后一个完全覆盖了失败的第一个。function foo(&$x)$x = &