PHP的=&运算符

45

这两个PHP语句是否在执行相同的操作?

$o =& $thing;

$o = &$thing;
6个回答

40

是的,它们两者是完全相同的事情。 它们只是引用对象的引用,并将其引用到变量$o中。 请注意,thing 应该是变量。


是的,抱歉我确实是指 $thing - Kev

29

从语法角度来看,它们不是同一件事。运算符=&是原子操作,这实际上很重要。例如,在三元表达式中无法使用=& 运算符。以下两种语法都无效:

$f = isset($field[0]) ? &$field[0] : &$field;
$f =& isset($field[0]) ? $field[0] : $field;

那么你应该使用这个:

isset($field[0]) ? $f =& $field[0] : $f =& $field;

我希望能找到一些文件来确认这一点,但是php.net并不是很清楚。What references do提到了=&,但是奇怪的是,在assignment operators中并没有实际出现=&(它总是$x = &$y;)。空格真的很重要吗?还是它们是相同的?你能提供一些参考资料吗? - Jon Surrell
如果PHP开发人员愿意,他们可以修改PHP解析器以允许上述第二个错误示例,但看起来=&组合是由预处理器而不是在运行时进行解释的。如果您查看PHP编译器/解释器的源代码,您可以确认这一点。 - Scott Lahteine

13

他们两个都会产生预期的T_PAAMAYIM_NEKUDOTAYIM错误。

如果你的意思是$o = &$thing;,那么它会将thing的引用分配给o。这里有一个例子:

$thing = "foo";

$o = &$thing;

echo $o; // echos foo

$thing = "bar";

echo $o; // echos bar

是的,抱歉我确实是指 $thing - Kev

12

差别非常重要:

<?php
$a = "exists";
$b = $a;
$c =& $a;
echo "a=".$a.", b=".$b.", c=".$c."<br/>"; //a=exists b=exists c=exists

$a = null;
echo "a=".$a.", b=".$b.", c=".$c; //a= b=exists c= 
?>

当$a变为NULL时,变量$c会被销毁,但变量$b会保留其值。


这不是问题的(当前编辑)所要求的。 - Autumn Leonard

1

是的,它们会。在这两种情况下,$o 都将成为对 thing引用(我假设 thing 不是一个常量,而是实际上作为变量有意义)。


你不能这样引用函数,也不能引用常量。 - Karl Laurentius Roos
卡尔,我认为那个东西不是常量,因为对常量的引用是无意义的。不过你关于函数的说法是正确的。 - Emil Vikström
是的,抱歉我确实是指 $thing - Kev
这个答案已经过时了,它是针对一个以前错误表述的版本的答案,请删除它。 - rubo77

1

是的,对不起,我确实是指$thing - Kev
这个答案已经过时了,它是针对一个以前错误表述的版本的答案,请删除它。 - rubo77

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