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
最重要的是,当运算符优先级不明确或需要可读性时,请使用括号。
好的,
所以请考虑以下几点:
$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
最重要的是,当运算符优先级不明确或需要可读性时,请使用括号。