三項演算子の複数の条件は安全ですか?

if-statement php ternary-operator
三項演算子の複数の条件は安全ですか?

三項演算子を入れ子にしてはいけないと言うアドバイスを見てきました。

以下のコードをテストしましたが、問題なく動作します。 私の質問は、このように使用される三項演算子を見たことがありません。 だから、これは「if」で使用されたのと同じくらい信頼性がありますか、このようなものが来て私に噛むことができます(用語や読みやすさではなく、失敗することによって)。

$rule1 = true;
$rule2 = false;
$rule3 = true;

$res = (($rule1 == true) && ($rule2 == false) && ($rule3 == true)) ? true : false;

if($res) {
    echo "good";
} else {
    echo "fail";
}

ありがとうございます。

  13  0


ベストアンサー

三項演算子から返す結果が「true」と「false」のみである場合、演算子は必要ありません。 あなただけを持つことができます:

$res = (($rule1 === true) && ($rule2 === false) && ($rule3 === true))

しかし、あなたの質問に答えるために、はい、複数の条件が完全にうまく機能します。

24


条件を変数に保存したい理由はありますか? これは上記の簡易バージョンです。

if($rule1 && !$rule2 && $rule3)
{
    echo "good";
}
else
{
    echo "bad";
}

4


それは完全に合法であり、動作し、「あたかも信頼できる」ように見えますが、見た目はいです。

各三項ステートメントを括弧内に入れると、ネストもうまくいきます。

$res = ( $rule1 ? true : ( $rule2 ? true : false ) )

マニュアルで推奨されている唯一のことは、次のように括弧なしでネストすることです。

$res = ( $rule1 ? true : $rule2 ? true : false )

3


「true」または「false」を返す場合、3進数は必要ありません。 http://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary [マニュアルの引用:]

_
式 `(expr1)? (expr2):(expr3) `は、expr1がTRUEと評価されるとexpr2に評価され、expr1がFALSEと評価されるとexpr3に評価されます。
_

これの意味は

$res = (($rule1 == true) && ($rule2 == false) && ($rule3 == true));

既にtrueまたはfalseを割り当てます。 また、$ ruleがブール値であることを気にしないのであれば、 `==`との比較は必要ありません。 また、ブレースも必要ありません。

$res = $rule1 && !$rule2 && $rule3;

最初の3進法と同じです。

そのような複数の式がある場合、実際の比較を意味のあるメソッドまたは関数名の背後に隠すことをお勧めします。

function conditionsMet($rule1, $rule2, $rule3) {
    return $rule1 && !$rule2 && $rule3;
}

そして、あなたはできる

if (conditionsMet($rule1, $rule2, $rule3)) {
    // do something
}

もちろん、 `conditionsMet`は意味がありません。 より良い例は、「isSummerTime」や「isEligibleForDiscount」などのようなものです。 ルールが表現するものをメソッド名で表現してください。

書籍http://martinfowler.com/books.html#refactoring [リファクタリング-既存のデザインの改善]のhttp://sourcemaking.com/refactoring/simplifying-conditional-expressions [条件式の単純化]コード]。

3


またすることができます

 $res = ($rule1 && !$rule2 && $rule3);

1


それは合法であり、「ugい」必要はありません。 私は頻繁に「フック」演算子を使用します。表形式では非常にきれいです。例えば:

bool haveANeed()
{
    //     Condition       result
    //     ----------      ------
    return needToEat()   ? true
         : needToSleep() ? true
         : needToStudy() ? true
         : needToShop()  ? true
         : needToThink() ? true
         :                 false; // no needs!
}

私見では、この関数はif-elseロジックで記述された場合、あまり明確ではなく、確かに長くなります。

-1


タイトルとURLをコピーしました