我有两个功能
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
答案 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
消息,您将看到以下错误:
严格标准:只有变量才能通过引用传递给......
...所以这种行为实际上是“按设计”。