PHP错误与三元运算符?

问题描述 投票:0回答:4
function foo() {
    return $result = bar() ? $result : false;
}

function bar() {
    return "some_value";
}

foo();

注意:未定义的变量:结果

这是一个错误?

酒吧()应保存到$结果,但事实并非如此。然而病情工作正常,它试图返回$结果或虚假陈述(如果巴()为null或false)

PHP 5.4.24

php operator-keyword ternary
4个回答
11
投票

这是因为operators precedence。做

function foo() {
    return ($result = bar()) ? $result : false;
}

- 所以分配将有更高的优先级进行评估。


2
投票

更优雅的解决方案:

function foo() {
    return bar() ?: false; 
}

0
投票

我们不能做的只是:

function foo() {
    return bar() ? $result : false;
}

function bar() {
    return "some_value";
}

foo();

0
投票

使用相同的表达中的子表达式的副作用是总是有风险的,即使运算符优先级是正确的。

即使有必要评估,以测试的条件$result = bar()的结果,有说该结果将在稍后的表达没有使用一般保证,而不是一个值赋值前服用。

参见例如Operator Precedence vs Order of Evaluation其中讨论这在C ++的上下文中,并给出了这种典型的例子:

a = a++ + ++a; 

有一个条件内的副作用也难以阅读 - 这可能被理解为$result == bar(),这将意味着完全不同的东西。

所以,在这种情况下,问题只是PHP的? :不幸的关联性,但像他这样写代码是一个坏主意,无论如何,你可以平凡使其更具可读性和可靠性,采取的副作用出左侧的侧:

$result = bar();
return $result ? $result : false;

或者,在这种情况下,假定$result不是globalstatic

return bar() ?: false;
© www.soinside.com 2019 - 2024. All rights reserved.