三元运算符的PHP错误?

时间:2014-03-25 11:47:30

标签: php operator-keyword ternary

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

function bar() {
    return "some_value";
}

foo();
  

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

这是一个错误吗?

bar()应保存到$ result,但不是。但是条件工作正常并且它试图返回$ result或false语句(如果bar()为NULL或false)

PHP 5.4.24

4 个答案:

答案 0 :(得分:11)

那是因为operators precedence。做

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

- 将以更高的优先级评估作业。

答案 1 :(得分:2)

更优雅的解决方案:

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

答案 2 :(得分:0)

我们不能这样做:

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

function bar() {
    return "some_value";
}

foo();

答案 3 :(得分:0)

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

即使为了评估条件而有必要评估 openssl req -x509 -out localhost.crt -keyout localhost.key \ -newkey rsa:2048 -nodes -sha256 \ -subj '/CN=localhost' -extensions EXT -config <( \ printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")的结果,也不能普遍保证该结果将在表达式的后面使用,而不是值在作业之前拍摄。

请参见示例Operator Precedence vs Order of Evaluation,该示例在C ++上下文中进行了讨论,并给出了一个经典示例:

$result = bar()

在条件中具有副作用也是很难理解的-它可能被读为a = a++ + ++a; ,这意味着完全不同。

因此,在这种情况下,问题只是PHP不幸的$result == bar()的关联性,但是编写这样的代码无论如何都不是一个好主意,并且可以通过以下方面使它更加可读性和可靠性更高:效果出现在左侧:

? :

或者在这种情况下,假设$result = bar(); return $result ? $result : false; 不是$resultglobal

static