问题:PSR-2
PHP三元语法中是否需要括号?
寻找以下三元语句的语法符合PSR-2(如果有) – 我还需要指向文档或某些权限链接:
$error =($error_status)? ‘错误’:’没有错误’;
要么
$error = $error_status? ‘错误’:’没有错误’;
注意:php.net它显示括号的语法,但我在任何’官方PSR-2’文档中找不到这个.
结论
如果没有PSR-2标准,哪种方式是最常见的惯例?
The PSR-2 standard明确省略对操作符的任何意见:
There are many elements of style and practice intentionally omitted by this guide. These include but are not limited to:
… Operators and assignment
由于括号用于对表达式进行分组,因此您的示例没有多大意义:
$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.