查找以下三元语句的语法(如果有)与PSR-2兼容 - 我还需要指向文档或某些权限链接:
$error = ($error_status) ? 'Error' : 'No Error';
OR
$error = $error_status ? 'Error' : 'No Error';
注意: php.net它显示括号的语法,但我在任何官方PSR-2'中找不到这个。文档。
如果没有PSR-2标准,哪种方式是最常见的惯例?
答案 0 :(得分:13)
The PSR-2 standard明确忽略了对运营商的任何意见:
本指南有意省略了许多风格和练习元素。这些包括但不限于: ......运营商和任务
由于括号用于对表达式进行分组,因此您的示例没有多大意义:
$error = ($error_status) ? 'Error' : 'No Error';
这里围绕括号中的单个变量没有任何意义。更复杂的情况可能会从括号中受益,但在大多数情况下,它们只是为了可读性。
更常见的模式是始终围绕整个三元表达式:
$error = ($error_status ? 'Error' : 'No Error');
这样做的主要动机是PHP中的三元运算符具有相当笨拙的关联性和优先级,因此在复杂表达式中使用它通常会产生意外/无用的结果。
常见的情况是字符串连接,例如:
$error = 'Status: ' . $error_status ? 'Error' : 'No Error';
这里连接(.
运算符)实际上在三元运算符之前进行了计算,因此条件始终是非空字符串(从'Status: '
开始),然后你将始终获得字符串Error'
作为结果。
括号是防止这种情况的必要条件:
$error = 'Status: ' . ($error_status ? 'Error' : 'No Error');
当“堆叠”三元表达式形成if-elseif链的等价物时存在类似的情况,因为PHP历史早期的错误意味着从左到右依次评估多个三元运算符,而不是简化整个错误分支当条件成立时。
the PHP manual的一个例子更清楚地解释了这一点:
// on first glance, the following appears to output 'true'
echo (true?'true':false?'t':'f');
// however, the actual output of the above is 't'
// this is because ternary expressions are evaluated from left to right
// the following is a more obvious version of the same code as above
echo ((true ? 'true' : false) ? 't' : 'f');
// here, you can see that the first expression is evaluated to 'true', which
// in turn evaluates to (bool)true, thus returning the true branch of the
// second ternary expression.
答案 1 :(得分:2)
通用惯例总是简化。
是一种PSR标准$error = $error_status ? 'Error' : 'No Error';
似乎比括号更清晰。
如果您想要更明确的可读性,PSR-2标准将转到:
if ($error_status) {
$error = 'Error';
else {
$error = 'No Error';
}
全部。 PSR是更好地理解我们的代码的标准,当你编写像你提供的代码时,你在简化方面做得更深入,并且你的想象力没有限制,只是避免不超过PSR规则。
使用PHP Code Sniffer检查PSR1和PSR2规则的代码。
答案 2 :(得分:2)
要记住的一件重要事情是PSR-2声明行不应超过80个字符。
三元语法有时可能很长,所以我认为我们缺少一种非常常见的代码建议。
我现在正在做的是这样缩进:
$stuff = $count > MyLongNamespace\MyLongClassName->get('count')
? 'yikes this seems to be some large stuff'
: 'erm this is rather small stuff';
答案 3 :(得分:1)
如果没有明确说明,则没有标准。要么有效。
答案 4 :(得分:0)
对此有一些不同的看法,不幸的是,这是任意的。
从我所见和所学到的东西中,对我来说更普遍的现象最好是通过注意以下差异来加以解释; 无论哪种情况,括号都不会移动。
长手:
if ($is_full_page) {
echo "medium-6";
} else {
echo "medium-7";
}
短手:
echo ($is_full_page) ? 'medium-6' : 'medium-7';
那个;对我来说;在所有方面都是真正的一致性。