首页  >  文章  >  后端开发  >  为什么在 PHP 中对函数调用加括号可以避免引用错误?

为什么在 PHP 中对函数调用加括号可以避免引用错误?

Susan Sarandon
Susan Sarandon原创
2024-10-26 22:35:30259浏览

Why Does Parenthesizing a Function Call in PHP Avoid a Reference Error?

PHP 中的括号和函数调用语义

在 PHP 中,将函数调用的结果括在括号中可以改变结果的语义,如下所示代码:

<code class="php">function get_array() {
   return array();
}

function foo() {
   // return reset(get_array());
   //              ^ error: "Only variables should be passed by reference"

   return reset((get_array()));
   //           ^ OK
}

foo();</code>

这种令人费解的行为在官方文档中没有明确的解释,导致开发者对其底层机制不确定。

分析

理解这种行为的关键在于 PHP 语言在解析函数调用参数时的模糊性。当函数调用周围添加括号(如 (get_array()) 所示)时,PHP 不会将其视为函数调用,而是视为表达式。这种区别至关重要,因为与表达式相比,用于发送变量的操作码 (ZEND_SEND_VAR_NO_REF) 对于函数调用具有不同的行为。

当遇到非函数调用表达式时,ZEND_SEND_VAR_NO_REF 会执行以下检查:

  1. 参数不是函数调用。
  2. 参数是引用或者引用计数为 1。

在提供的示例中,括号内的函数call ((get_array())) 满足两个条件:

  1. 由于多余的括号,它不会被识别为函数调用。
  2. 返回的数组引用计数为 1因为它仅在函数调用中被引用。

因此,操作码继续执行而不会抛出“仅变量应通过引用传递”错误。但是,请务必注意,此行为被视为错误,不应在生产代码中依赖。

以上是为什么在 PHP 中对函数调用加括号可以避免引用错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn