2016-12-15 7 views
0

各項目がプロパティとして割り当てられる前に特定の条件を満たすかどうかをチェックするクラス内でforeachループを作成しましたが、これに対して三項比較を使用することを考えました。プロパティ宣言のための三項比較をtrueのときに使用

次のコードは正常に動作しますが判明:

$res = []; 
$config = [ 
    'red' => 'RED', 
    'magenta' => 'MAGENTA', 
    'blue' => 'BLUE', 
    'lilac' => 'LILAC' 
]; 
$allowed = ['red', 'green', 'blue']; 

foreach($config as $name => $value) { 
    in_array($name, $allowed) ? $res[$name] = $value:''; 
} 

print_r($res); 

それは返します、今、私の質問がある

Array 
(
    [red] => RED 
    [blue] => BLUE 
) 

これは三元比較の有効利用のですか?それともバグですか?コードは今よりはるかに単純に見えますが、私は将来「固定」になるかもしれない何かを使用したくありません。

答えて

0

これは有効なコードです。三元の構文は次のとおりです。

<condition> ? <then-expression> : <else-expression> 

代入は式の型であるので、それは<then-expression>で許可されています。リテラル文字列も有効な式です。

任意の式がステートメントとして許可されているため、結果をステートメントとして何も割り当てずに3項式を使用できます。

しかし、私はほとんどのプログラマーがこの貧弱なスタイルを考えていると思います。三項の目的は、周囲のコードを繰り返さないように、値が必要な場所で条件式を使用する簡潔な方法を提供することです。

$var = isset($var1) ? $var1 : ''; 

代わり

if (isset($var1)) { 
    $var = $var1; 
} else { 
    $var = ''; 
} 

のあなたが値を使用していない場合は、回避するための冗長性、巧妙な出現しようとするよりも、三元、他のを使用するか、行のカップルを保存するので、少し理由はありません。

0

else文/ブロックが本当に必要ないので、if文だけを使う方がよいでしょう。しかし

本番コードとすべてのものを書いている場合は、それが必要として動作し、(あなたがそれらを持っている場合)には、コードレビューを渡し、あなたはそれはおそらく将来

で他の誰かによって固定されてしまうことはありません、適切なユニットテストを提供します
+0

返信いただきありがとうございます。「固定」とは、将来のリリースのPHPでこの動作が変更される可能性があることを意味します。 –

関連する問題