PSR-2 PHP三元语法中是否需要括号?

时间:2014-10-15 18:03:26

标签: php psr-2 psr-1

问题:PSR-2 PHP三元语法中是否需要括号?

查找以下三元语句的语法(如果有)与PSR-2兼容 - 我还需要指向文档或某些权限链接:

$error = ($error_status) ? 'Error' : 'No Error';

OR

$error = $error_status ? 'Error' : 'No Error';


注意: php.net它显示括号的语法,但我在任何官方PSR-2'中找不到这个。文档。


结论

如果没有PSR-2标准,哪种方式是最常见的惯例?

5 个答案:

答案 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规则的代码。

Code Sniffer

答案 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';

那个;对我来说;在所有方面都是真正的一致性。