前に一致するケースがある場合、switch ステートメントのデフォルトは評価されますか?
元:
switch ($x) {
case ($x > 5): print "foo";
case ($x%2 == 0): print "bar";
default: print "nope";
}
x = 50 の場合、foo
and bar
、 or foo
and bar
and nope
?
前に一致するケースがある場合、switch ステートメントのデフォルトは評価されますか?
元:
switch ($x) {
case ($x > 5): print "foo";
case ($x%2 == 0): print "bar";
default: print "nope";
}
x = 50 の場合、foo
and bar
、 or foo
and bar
and nope
?
はい、「ブレーク」がない場合、最初にcase
一致したアクションに続くすべてのアクションが実行されます。制御フローは、後続のすべての を「フォールスルー」し、ステートメントが検出されるまで、またはステートメントの最後に到達するまで、case
後続の各 の下ですべてのアクションを実行します。case
break;
switch
あなたの例では、$x の値が 50 の場合、実際には が表示されます"nope"
。
は、キーワードに続く式とキーワードに続く各式とswitch
の間で、実際には単純な等価性テストを実行していることに注意してください。switch
case
$x の値が 0 の場合にのみ表示されるという点で、あなたの例は珍しいものです"foo"
(実際、$x の値が 0 の場合、「foo bar nope」と表示されます)。
キーワードに続く式case
が評価されます。この例では、0 (条件テストが false の場合) または 1 (条件テストが true の場合) を返します。switch
と比較するのはその値 (0 または 1) です$x
。
前に一致するケースがある場合、switch ステートメントのデフォルトは評価されますか?
多くの場合、そこに s があるため、ほとんどcase
の s ではそうすべきではありませんbreak
。ただし、あなたの場合はdefault
.
また、これらの単一行を実行しないようにしてください (読みやすくするため):
$x = 10;
switch (true) {
case ($x > 5):
print "foo";
case ($x%2 == 0):
print "bar";
default:
print "nope";
}
印刷しますfoobarnope
。あなたの質問に答えるには:はい:-)
自分で試してみた方が簡単だったでしょう。
いずれにせよ、ケースで break を使用しない場合は、それに続くすべてのケースが実行されます (デフォルトを含む)。
それはスイッチの仕組みではありません。
switch ステートメントは、同じ式に対する一連の IF ステートメントに似ています。多くの場合、同じ変数 (または式) をさまざまな値と比較し、どの値に等しいかに応じて異なるコードを実行したい場合があります。これはまさに switch ステートメントの目的です。
みたいな評価
case ($x > 5):
単に等しい
case true:
また
case false:
$x
なぜならの値に応じて、($x > 5)
はVALUEではなくEVALUATIONです。スイッチは、パラメータの値を比較して、それが のいずれかと等しいかどうかを確認します。case
switch($x) {
case ($x > 5): // $x == ($x > 5)
echo "foo";
break;
case ($x <= 5): // $x == ($x <= 5)
echo "bar"
break;
default:
echo "default";
break;
}
上記のコードの比較は次と同等です
if ($x == ($x > 5)) {
echo "foo";
} elseif ($x == ($x < 5)) {
echo "bar";
} else {
echo "five";
}
これは (いつ$x == 50
) と同等です
if ($x == true) {
echo "foo";
} elseif ($x == false) {
echo "bar";
} else {
echo "five";
}
これはと同等です
if (true) { // $x == true is the same as saying "$x is truthy"
echo "foo";
} elseif (false) {
echo "bar";
} else {
echo "five";
}
ただし、 IFは、意図したとおりに switch ステートメントを使用しました (パラメーターを具体的な値と比較するため)。
switch ($x) {
case 50:
echo "foo ";
case 30:
echo "bar ";
default:
echo "foo-bar";
}
そして$x == 50
、あなたの出力は
foo bar foo-bar
あなたのケースには何もないという事実のためにbreak
。
各ケースの末尾にキーワードを追加するbreak
と、その特定のケースのコードのみが実行されます。
switch ($x) {
case 50:
echo "foo ";
break;
case 30:
echo "bar ";
break;
default:
echo "foo-bar";
break;
}
出力:
foo