Превключвателите не работят така.
Съгласно ръководството:
Операторът за превключване е подобен на поредица от оператори IF за един и същи израз. В много случаи може да искате да сравните една и съща променлива (или израз) с много различни стойности и да изпълните различна част от кода в зависимост от стойността, на която се равнява. Точно за това е операторът switch.
Оценка като
case ($x > 5):
просто се равнява на
case true:
or
case false:
в зависимост от стойността на $x
, защото ($x > 5)
е ОЦЕНКА, а не СТОЙНОСТ. Превключвателите сравняват стойността на параметъра, за да видят дали се равнява на някой от 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 ($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