PHP忽略通过引用传递,如果VAR在函数调用分配

问题描述:

我有两个功能PHP忽略通过引用传递,如果VAR在函数调用分配

function c(&$x) 
{ 
    $x = 25; 
    echo 'c is called, x = ' . $x . PHP_EOL; 
} 

function b() 
{ 
    echo 'b is called'. PHP_EOL; 
    return 5; 
} 

然后我写了下面的代码,因为我想到应该把)B的结果(以$ O,再通过$ o通过引用c()将其设置为新值。它的工作原理确定:

$o=b(); 
c($o); 
echo 'o is '.$o; 

的输出为预期:

b is called 
c is called, x = 25 
o is 25 

但是,如果我尝试在函数调用这样分配的$ O值:

c($o = b()); 
echo 'o is '.$o; 

我变得怪异输出

b is called 
c is called, x = 25 
o is 5 

函数的顺序ca lls仍然是一样的,但是为什么$ o没有改变,尽管它是通过引用传递的?如果在函数调用中赋值,PHP是否强制性地通过值传递参数?如果是的话,那么这个版本是以这种方式工作的?根据这个评论:2006年的http://www.php.net/manual/en/functions.arguments.php#71198它的工作方式不同。我的版本是5.3.6

+0

试试这个$ o = c(b()); – 2012-03-07 12:42:45

+2

随着最大error_reporting,我有'严格的标准:只有变量应通过引用传递与您的第二个版本。 – 2012-03-07 12:46:43

+0

谢谢。忘了严格。但无论如何,这样的代码已经在以前的PHP版本中工作。也许我必须检查最新PHP版本的更新日志。 – Miroshko 2012-03-07 12:59:21

这是Zend引擎的一个限制,即我所遇到前使用socket_select()/stream_select(),这都需要参数“资源阵”通过引用传递时尤为如此。能够在一行中分配要通过引用传递的变量的值是很好的,但它不是(当前)可以实现的。

我已经看到了(虽然现在我找不到在哪里,(这是here),它可能没有权威性反正 ),在PHP的任何表达式求的右侧前面提到的表达方式。我的意思是:

$a = 1; 
$b = 2; 
echo $a = $b; 

这将呼应2,因为这是通过echo语句中的表达式计算表达式$b,这是2的右侧。

当通过表达一个函数的结果,如c($o = b());,你是路过的$o = b();的功能c()的结果,这是我的理解(虽然我可能是错的),该表达式的结果传递进入函数并执行该函数,之前 a zval被创建并分配为保存$o,这种行为旨在减少内存消耗并加速内部处理,当函数以这种方式嵌套时。这意味着你实际上没有通过引用传递变量,你只需传入由表达式右边的b()产生的值 - 由于它没有变量容器,因此无法通过引用修改该值。

事实上,如果你打开E_STRICT消息,您会看到以下错误:

Strict Standards: Only variables should be passed by reference in ...

...所以这种行为实际上是在“设计”。

+4

*设计*自PHP 5.0.5开始,以避免内存损坏。 [来源](http://the-stickman.com/web-development/php/php-505-fatal-error-only-variables-can-be-passed-by-reference/) – 2012-03-07 12:55:39

+0

@GuillaumePoussel感谢您的确认并且很好的挖掘这些信息:-D – DaveRandom 2012-03-07 13:01:42