Это не так, как работают переключатели.
В соответствии с руководством :
Оператор switch похож на ряд операторов IF на то же выражение. Во многих случаях вам может понадобиться сравнить одну и ту же переменную (или выражение) со многими различными значениями и выполнить другой фрагмент кода в зависимости от того, какое значение оно равно. Это как раз то, что означает оператор switch.
blockquote>Оценка, подобная
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"; }
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