如果在函数调用中分配了var,则PHP忽略通过引用传递
我有两个功能
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,将其设置为新值.它工作正常: $o=b(); c( $o ); echo 'o is '.$o; 输出符合预期:
但是,如果我尝试在函数调用中分配$o的值,如下所示: c( $o = b() ); echo 'o is '.$o; 我得到奇怪的输出
函数调用的顺序仍然是相同的,但为什么$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(),我的理解(尽管我可能是错的)表达式的结果被传递到函数并且函数被执行,在创建zval并指定为持有$o之前,行为是旨在减少内存消耗,并在以这种方式嵌套函数时加速内部处理.这意味着您实际上没有通过引用传递变量,您只是传递了由b() – 表达式的右侧 – 产生的值 – 由于它没有变量容器,因此无法通过引用进行修改. 实际上,如果您打开E_STRICT消息,您将看到以下错误:
……所以这种行为实际上是“按设计”. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |