在 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 会执行以下检查:
在提供的示例中,括号内的函数call ((get_array())) 满足两个条件:
因此,操作码继续执行而不会抛出“仅变量应通过引用传递”错误。但是,请务必注意,此行为被视为错误,不应在生产代码中依赖。
以上是为什么在 PHP 中对函数调用加括号可以避免引用错误?的详细内容。更多信息请关注PHP中文网其他相关文章!