PHP - 正确的三元实现

时间:2015-04-07 14:39:34

标签: php syntax

确定,

请考虑以下事项:

$this->foo = isset($_GET['foo']) && !empty($_GET['foo']) ? $_GET['foo'] : NULL;

和此:

$this->foo = (isset($_GET['foo']) && !empty($_GET['foo'])) ? $_GET['foo'] : NULL;

当我编写带有多个检查的if / else语句时,我通常会在第二个示例中包含额外的括号。在三元组中,两个例子都有效。

我应该在底部添加额外的括号吗?或者选择第一个?

由于

3 个答案:

答案 0 :(得分:1)

运算符优先级是关于括号何时必要的问题(尽管可读性)。

当处理三元运算符时,请查看PHP用于对表达式进行分组的顺序,从三元运算符开始,检查之后分组的运算符。三元运算符。那些是有可能产生错误输出的运营商。

PHP Operator Precedence,从三元开始:

Assoc.  Operators                   Additional Information
...
left    ? :                         ternary
right   = += -= *= **= /= .= %=  
        &= %= &= |= ^= <<= >>= =>   assignment
left    and                         logical
left    xor                         logical
left    or                          logical
left    ,                           many uses

在这种情况下,有赋值运算符,低优先级逻辑运算符和逗号。

看起来三元和赋值是相等的,因此当两者在同一语句中时,分组由它们的关联性决定。

$a = true? 'yes': 'no';
// $a is assigned 'yes'

分配是右关联的,因此,与=相关,表达式从右到左分组。在这种情况下,三元组首先出现(最右边),语句按预期工作。

留下较低的优先级布尔值和逗号。

echo true and true? 'yes': 'no';
// Echos: 1
// Grouped like: echo true and (true? 'yes': 'no');

与预期不符。使用括号强制执行预期的分组:

echo (true and true)? 'yes': 'no';
// Echos: yes

当使用更高优先级布尔运算符时,它们在三元运算符之前分组,不需要括号。

echo true && true? 'yes': 'no';
// Echos: yes

底线,当运算符优先级不清楚或需要可读性时,请使用括号。

答案 1 :(得分:0)

The PSR-2 standard明确忽略了对运营商的任何意见。但在这种情况下,我会选择简单的一个:

$this->foo = isset($_GET['foo']) && !empty($_GET['foo']) ? $_GET['foo'] : NULL;

答案 2 :(得分:0)

我是第一种方法:

$this->foo = isset($_GET['foo']) && !empty($_GET['foo']) ? $_GET['foo'] : NULL;

简化为

$this->foo = !empty($_GET['foo']) ? $_GET['foo'] : NULL;

empty已经检查了isset。只有当条件有超过3个语句时,我才会在这种情况下包含parathenis。考虑到1行if / else通常在条件简单时使用,否则更具可读性,否则你应该使用经典if {} else {}