PHP操作符=&的含义是什么?

37

可能是重复问题: PHP中的"=&"和"&="运算符是什么意思?

我在以下代码中看到了"=&"运算符,但我不知道它是什么意思。它的含义是什么,它是做什么用的?

我阅读到它的代码::

function ContentParseRoute($segments)
{
    $vars = array();

    //Get the active menu item
    $menu =& JSite::getMenu();
    $item =& $menu->getActive();

    // Count route segments
    $count = count($segments);
        ....

3
这篇文章解释了PHP中各种运算符的含义和用法,包括算术、比较、逻辑、位运算和三元运算符等。它还涵盖了运算符优先级和结合性等重要概念。 - muhmuhten
3个回答

62

这不是通过引用(&)来进行赋值(=)的。

如果你说:

$a = 42;
$b =& $a;

您实际上是在说将$a 按引用赋值给$b

按引用赋值会将这两个变量“绑定”在一起。现在,如果稍后修改$a$b也会随之改变。

例如:

$a = 42;
$b =& $a;

//later
echo $a; // 42
echo $b; // 42

$a = 13;
echo $a; // 13
echo $b; // 13

编辑:

正如Artefacto在评论中指出的那样,$a =& $b$a = (&$b)不同的

这是因为尽管&运算符可以将某个东西变成引用,但=运算符执行的是按值分配,因此表达式$a = (&$b)的意思是创建对$b的临时引用,然后将该临时引用的值分配给$a,这不是按引用分配。


11
$b = (&$a); 不是有效的语法。我知道这不是你的重点,但 =& 实际上是一个单一的运算符,对应着操作码 ASSIGN_REF。这不是无关紧要的内部观察。考虑一个返回引用的函数 func(),赋值语句 $a = func() 中,尽管该函数返回了一个引用,但 $a 并不会成为一个引用,因为操作符 = 打破了引用的集合并清除了标志位。你必须实际执行 $a =& $func(),其中 & 的意思是“将这个变量作为引用处理(例如 array(&$a))”,但仅仅将变量转变为引用还不足以让其能够进行引用赋值。 - Artefacto
4
真的吗?我不知道,而且以前从来没有出现过这种情况(至少表面上是这样)。看来每天都会学到东西。 :) 我会为这个更正编辑我的回答。 - Austin Hyde
3
应该是“这是一个按引用赋值的任务”吗?对我来说,“你实际上是在说将$b按引用分配给$a”也感觉更加直观。 - And Finally

7

这是引用赋值运算符

这意味着当你在代码中稍后修改运算符的左侧时,它会修改右侧。你将左侧指向了与右侧占用相同内存块。


4
好的,我会尽力以最通俗易懂的方式翻译以下内容,同时保持原意不变。请注意,LHS代表等式左边,RHS代表等式右边。 - Htbaa
这是正确的(至少你没有说“这实际上是两个运算符”)。然而,最后一句话有点误导。在$a = $b;中,$b在大多数情况下也会指向与$a相同的内存块。不同之处在于变量在修改时会被分离,而如果它在引用集中,则不会。可能更准确的说法是“LHS和RHS上的符号是同一个变量”,或者类似的说法,并省略“内存”引用。 - Artefacto
被接受的答案似乎意味着当你修改右手边时,左手边也会被修改。这是否正确? - Kim Stacks
“修改”是否意味着$lhs=&$a; $lhs='yes'; echo $a;会打印出“yes”? 并且 “修改”是否意味着$lhs=&$a; $a='yes'; echo $lhs;会打印出“yes”? - David Spector

5
以下是使用示例:

这是一个使用示例:

$array = array('apple', 'orange', 'banana');

// Without &
foreach($array as $d)
{
    $d = 'fruit';
}

echo implode(', ', $array); // apple, orange, banana

// With &
foreach($array as &$d)
{
    $d = 'fruit';
}

echo implode(', ', $array); // fruit, fruit, fruit

这不是一种解释,而是一个使用&运算符而不使用=&赋值的示例。


1
请查看我对其他答案的评论。不要被“&”符号的几种含义所困惑。它们都与引用有关,但并不意味着相同的事情。 - Artefacto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接