括号和函数调用结果的含义
考虑以下示例:
<?php function get_array() { return array(); } function foo() { return reset(get_array()); // Error: "Only variables should be passed by reference" }
在此代码中,发生错误的原因是函数调用的结果不是引用。但是,如果结果用括号括起来,错误就会消失:
function foo() { return reset((get_array())); // OK }
这里发生了什么?
尽管没有明确描述此行为的文档,但可以通过检查来理解PHP 语法和编译器实现。
对解析的影响
括号导致 PHP 的解析器将函数调用的结果解释为表达式而不是变量。这会影响编译器解释代码的方式,特别是用于向函数发送变量的操作码。
引用计数和 Zend 引擎优化
Zend 引擎,PHP 的核心引擎,允许在需要引用的地方使用引用计数为 1 的非引用变量。在上面的示例中,返回的数组是引用计数为 1 的新对象。这允许 Zend 引擎优化代码并避免错误消息。
限制
需要注意的是,此行为被视为错误,不应依赖。函数调用结果的引用计数可能会在未来的 PHP 版本中发生变化,从而破坏依赖于此行为的代码。
替代解决方案
避免依赖这种潜在的不稳定行为,将函数调用的结果显式分配给变量:
function foo() { $result = get_array(); return reset($result); }
以上是为什么括号可以修复 PHP 函数调用中的'仅应通过引用传递变量”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!