Выключатели так не работают.
Согласно руководству:
Оператор switch похож на серию операторов IF для одного и того же выражения. Во многих случаях вам может потребоваться сравнить одну и ту же переменную (или выражение) со многими различными значениями и выполнить другой фрагмент кода в зависимости от того, какому значению оно соответствует. Это именно то, для чего предназначен оператор switch.
Оценка, как
case ($x > 5):
просто приравнивается к
case true:
or
case false:
в зависимости от значения $x
, потому что ($x > 5)
— это ОЦЕНКА, а не ЗНАЧЕНИЕ. Переключатели сравнивают значение параметра, чтобы увидеть, соответствует ли оно какому-либо из 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";
}
Однако, ЕСЛИ, вы использовали свой оператор 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
person
Matt
schedule
10.08.2012
case ($x > 5)
оценивается какcase 1:
илиcase true:
. - person Matt   schedule 10.08.2012break
ваш код будет пытаться соответствовать всем условиям. Сbreak
он остановится на 1-м совпадении. - person N.B.   schedule 10.08.2012