function foo() {
return $result = bar() ? $result : false;
}
function bar() {
return "some_value";
}
foo();
注意:未定义的变量:结果
这是一个错误?
酒吧()应保存到$结果,但事实并非如此。然而病情工作正常,它试图返回$结果或虚假陈述(如果巴()为null或false)
PHP 5.4.24
这是因为operators precedence。做
function foo() {
return ($result = bar()) ? $result : false;
}
- 所以分配将有更高的优先级进行评估。
更优雅的解决方案:
function foo() {
return bar() ?: false;
}
我们不能做的只是:
function foo() {
return bar() ? $result : false;
}
function bar() {
return "some_value";
}
foo();
使用相同的表达中的子表达式的副作用是总是有风险的,即使运算符优先级是正确的。
即使有必要评估,以测试的条件$result = bar()
的结果,有说该结果将在稍后的表达没有使用一般保证,而不是一个值赋值前服用。
参见例如Operator Precedence vs Order of Evaluation其中讨论这在C ++的上下文中,并给出了这种典型的例子:
a = a++ + ++a;
有一个条件内的副作用也难以阅读 - 这可能被理解为$result == bar()
,这将意味着完全不同的东西。
所以,在这种情况下,问题只是PHP的? :
不幸的关联性,但像他这样写代码是一个坏主意,无论如何,你可以平凡使其更具可读性和可靠性,采取的副作用出左侧的侧:
$result = bar();
return $result ? $result : false;
或者,在这种情况下,假定$result
不是global
或static
:
return bar() ?: false;