PHP - 正确的三元实现

PHP - correct ternary implementation

好的,

所以请考虑以下几点:

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

还有这个:

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

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

我应该像底部那样添加额外的括号吗?还是选择第一个?

谢谢

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

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

我赞成第一种方法:

$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 {}

则具有更高的可读性

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

在处理 三元 运算符时,请查看 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

最重要的是,当运算符优先级不明确或需要可读性时,请使用括号。