PSR-2 規格では、特にオペレーターに関する意見が省略されています。
このガイドでは、意図的に省略されたスタイルと実践の多くの要素があります。これらには以下が含まれますが、これらに限定されません: ... 演算子と代入
括弧は式をグループ化するために使用されるため、あなたの例はあまり意味がありません:
$error = ($error_status) ? 'Error' : 'No Error';
ここで、単一の変数を括弧で囲むことには意味がありません。より複雑な条件では括弧が役立つ場合がありますが、ほとんどの場合、括弧は読みやすさのみを目的としています。
より一般的なパターンは、常に三項式全体を囲むことです。
$error = ($error_status ? 'Error' : 'No Error');
これの主な動機は、PHP の三項演算子の結合性と優先順位がかなりぎこちないため、複雑な式で使用すると予期しない/役に立たない結果が生じることが多いためです。
一般的なケースは、文字列の連結です。次に例を示します。
$error = 'Status: ' . $error_status ? 'Error' : 'No Error';
ここで、連結 ( .
operator) は実際には三項演算子の前に評価されるため、条件は常に空でない文字列 ( beginning 'Status: '
) であり、常にError'
結果として文字列を取得します。
これを防ぐには、括弧が必要です。
$error = 'Status: ' . ($error_status ? 'Error' : 'No Error');
同様の状況は、if-elseif チェーンと同等のものを形成するために三項式を「積み重ねる」場合にも存在します。PHP の歴史の初期の間違いは、複数の三項演算子が左から右に順番に評価されることを意味するためです。本当です。
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.