加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 16:43:56 所属栏目: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,将其设置为新值.它工作正
我有两个功能

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;

输出符合预期:

06002

但是,如果我尝试在函数调用中分配$o的值,如下所示:

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

我得到奇怪的输出

06004

函数调用的顺序仍然是相同的,但为什么$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消息,您将看到以下错误:

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读