13

質問: PSR-2 PHP 3 項構文では括弧が必要ですか?

次の 3 項ステートメントの構文のどれが 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';

ここで、連結 ( .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.
于 2014-10-15T20:52:24.983 に答える
2

心に留めておくべき重要な点の 1 つは、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 に答える
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 に答える