Случай переключения PHP

Будет ли оцениваться значение по умолчанию оператора 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