13

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

寻找以下三元语句的语法中的哪一个(如果有的话)符合 PSR-2 - 我还需要指向文档或一些权威链接:

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

或者

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


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


结论

如果在这方面没有 PSR-2 标准,哪种方式是最常见的约定?

4

5 回答 5

18

PSR-2 标准特别省略了对运营商的任何意见:

本指南有意省略了许多风格和实践元素。这些包括但不限于: ... 运算符和分配

由于括号用于对表达式进行分组,因此您的示例没有多大意义:

$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 历史早期的一个错误意味着多个三​​元运算符按从左到右的顺序求值,而不是在条件满足时缩短整个 false 分支是真的。

PHP手册中的一个例子更清楚地解释了这一点:

// 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.
于 2014-10-15T20:52:24.983 回答
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 规则检查您的代码。

代码嗅探器

于 2014-10-15T21:07:55.357 回答
2

要记住的一件重要事情是 PSR-2 规定行不应超过 80 个字符
三元语法有时会很长,所以我认为我们缺少对一种非常常见的代码的推荐。我目前正在做的是像这样缩进:

$stuff = $count > MyLongNamespace\MyLongClassName->get('count') 
    ? 'yikes this seems to be some large stuff'
    : 'erm this is rather small stuff';
于 2016-04-01T17:24:26.980 回答
1

如果没有明确说明,则没有标准。要么工作。

于 2014-10-15T18:08:24.570 回答
0

对此有一些不同的看法,不幸的是,这是武断的。

从我所见和从中学到的东西对我来说似乎更常见,最好通过注意下面的差异来解释,更具体地说;在这两种情况下,括号如何不动。

长手:

if ($is_full_page) {
  echo "medium-6";
} else {
  echo "medium-7";
}

短手:

echo ($is_full_page) ? 'medium-6' : 'medium-7';

那; 对我来说; 它的美丽是真正的一致性。

于 2019-06-01T11:11:51.963 回答