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
这是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 ...
...所以这种行为实际上是在“设计”。
*设计*自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
@GuillaumePoussel感谢您的确认并且很好的挖掘这些信息:-D – DaveRandom 2012-03-07 13:01:42
试试这个$ o = c(b()); – 2012-03-07 12:42:45
随着最大error_reporting,我有'严格的标准:只有变量应通过引用传递与您的第二个版本。 – 2012-03-07 12:46:43
谢谢。忘了严格。但无论如何,这样的代码已经在以前的PHP版本中工作。也许我必须检查最新PHP版本的更新日志。 – Miroshko 2012-03-07 12:59:21