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手册中的一个例子,更加清晰地解释了这个问题:
echo (true?'true':false?'t':'f');
echo ((true ? 'true' : false) ? 't' : 'f');
if () {...} else {...}
块或通过使用“带有可选覆盖”的赋值来跳过else
可能更易读:$f = 'foo'; if ($case) { $f = 'bar'; }
(<-- 在 SO 评论中不要换行。) - beporter