如果在函数调用中分配了var,则PHP忽略通过引用传递

时间:2012-03-07 12:39:08

标签: php pass-by-reference php-5.3

我有两个功能

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

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

1 个答案:

答案 0 :(得分:3)

这是我之前遇到的Zend引擎的限制,特别是在使用socket_select() / stream_select()时,它们都需要通过引用传递“资源数组”参数。能够通过引用在一行中分配要传递的变量的值会很好,但是(目前)不可能这样做。

我之前看过它(虽然现在我找不到哪里,(它是here)并且它可能不是权威的)但PHP中的任何表达式评估表达式的右侧。我的意思是:

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

这将回显2,因为传递echo语句的表达式会计算表达式$b的右侧,即2

将表达式的结果传递给函数,例如c( $o = b() );,将$o = b();的结果传递给函数c(),这是我的理解(尽管我可以是错误的)将表达式的结果传递给函数并执行函数,创建zval并分配给$o之前,设计的行为当函数以这种方式嵌套时,减少内存消耗并加速内部处理。这意味着您实际上没有通过引用传递变量,您只是传递了由b() - 表达式的右侧 - 产生的值 - 由于它没有引用,因此无法通过引用进行修改变量容器。

的确,如果您打开E_STRICT消息,您将看到以下错误:

  

严格标准:只有变量才能通过引用传递给......

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