Naprawdę zgłupiałem. Albo o czymś nie wiem.
Mam w programie taki test, gdzie zmienna może przyjąć trzy wartości: mniejszą od zera, większą od zera bądź zero.
Żeby nie jechać trzy razy if / else if / else if napisałem swich(), który w zależności od wartości zmiennej podejmuje odpowiednie działania.
W case() sprawdzam po kolei wystąpienie wszystkich warunków:
case ($a < 0) ... bla bla rób to; break;
case ($a > 0) ... bla bla rób tamto; break;
case ($a == 0) ... bla bla siamto; break;
Moja radośc trwała do momentu, gdy zmienna $a przyjęła wartość 0, a wkonał się kod zawarty w teście case($a < 0).
Myślę sobie, qrde, co jest, od kiedy 0 jest mniejsze od 0 ?
No i zaczęła się walka.
Ustawiałem warunki w różnej kolejności, eliminowałem warunek case ($a == 0), wtedy i tak wykonywał się kod zawarty w case ($a < 0),
rzutowałem $a na wszelkie możliwe intval-e , integery itp. , porównywałem ją w taki sposób: case ($a === 0).
Nic.
Uprzedzając wszelkie pytania: nie ma błędów w składni, wszędzie są brejki itd.
Z problemem zetknąłem się w większej aplikacji, ale dla porównania napisałem sobie ten test:
<?php //$a = -1; $a = 0; //$a = 1; switch ($a) { }//switch if ($a == 0) { } else if ($a < 0) { } else if ($a > 0) { }//if ?>
Teraz, gdy uruchamiam go sobie po kolei dla każdej wartości $a, mam następujące wyniki:
Kod
$a = -1
w switch(): a < 0
w if() / else if() / else if() : a < 0
w switch(): a < 0
w if() / else if() / else if() : a < 0
Kod
$a = 1
w switch(): a > 0
w if() / else if() / else if() : a > 0
w switch(): a > 0
w if() / else if() / else if() : a > 0
A teraz uwaga: dla $a = 0:
Kod
$a = 0
w switch(): a < 0
w if() / else if() / else if() : a = 0
w switch(): a < 0
w if() / else if() / else if() : a = 0
WTF ?