Будет ли оцениваться значение по умолчанию оператора switch, если перед ним есть соответствующий случай?
например:
switch ($x) { case ($x > 5): print "foo"; case ($x%2 == 0): print "bar"; default: print "nope"; }
поэтому для x = 50 вы увидите foo
и bar
, или foo
и bar
и nope
?
Да, если нет «перерыва», тогда будут выполняться все действия, следующие за первым совпадением. Управляющий поток «провалится» во все последующий case
и выполнит все действия в каждом последующем case
до break;
, или до тех пор, пока не будет достигнут конец оператора switch
.
В вашем примере, если $ x имеет значение 50, вы фактически увидите "nope"
.
Обратите внимание, что switch
фактически выполняет простой тест равенства, между выражением, следующим за ключевым словом switch
, и каждым выражением, следующим за ключевым словом case
.
Ваш пример необычен, поскольку он отображает только "foo"
когда $ x имеет значение 0. (Фактически, когда $ x имеет значение 0, то, что вы увидите, будет «foo bar nope».)
Выражается выражение, следующее за ключевым словом case
, которое в вашем случае возвращает return 0 (если условный тест равен false) или 1 (если условный тест является истинным). И это значение (0 или 1), которое switch
, сравнивается с $x
.
Будет ли оцениваться значение по умолчанию оператора switch, если перед ним есть соответствующий случай?
В большинстве case
это не должно быть, потому что вы часто бывали там. Однако в вашем случае это также будет идти по default
.
Также, пожалуйста, постарайтесь не использовать эти однострочные файлы (для удобства чтения):
$x = 10; switch (true) { case ($x > 5): print "foo"; case ($x%2 == 0): print "bar"; default: print "nope"; }
Будет печатать foobarnope
. Поэтому, чтобы ответить на ваш вопрос: yep 🙂
Было бы проще попробовать это самостоятельно. но в любом случае, если вы не используете break в случае, все последующие за ним дела будут выполнены (в том числе по умолчанию)
Это не так, как работают коммутаторы.
Согласно руководству :
Оператор switch похож на ряд операторов IF на одно и то же выражение. Во многих случаях вам может понадобиться сравнить одну и ту же переменную (или выражение) со многими различными значениями и выполнить другой фрагмент кода в зависимости от того, какое значение оно равно. Это именно то, для чего предназначен оператор switch.
Оценка, подобная
case ($x > 5):
просто приравнивается к
case true:
или
case false:
в зависимости от значения $x
потому что ($x > 5)
является ОЦЕНКОЙ , а не VALUE . Переключатели сравнивают значение параметра, чтобы убедиться, что оно соответствует одному из case
s.
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"; }
ЕСЛИ , однако, вы использовали оператор 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