Jaką wartość wyświetli przedstawiony kod PHP?
$liczba = 10; switch ($liczba) { case 10: $liczba++; case 20: $liczba++; break; default: $liczba = 0; } echo $liczba;
break w przypadku dla 20 zatrzymuje wykonanie przed default.$liczba++ brakuje break, więc wykonuje się też kolejny przypadek.break sprawia, że zmienna rośnie dwa razy, z 10 do 12.case 10 zmienia wartość zmiennej.switch porównuje wartość tylko raz, na początku, i skacze do pasującej etykiety case. Dla 10 wykonuje się $liczba++ i zmienna ma wartość 11. W tym miejscu nie ma jednak break, więc wykonanie przechodzi dalej do instrukcji kolejnego case, bez ponownego sprawdzania warunku. Drugie $liczba++ daje 12, a dopiero break kończy instrukcję i echo wypisuje 12.
To zjawisko nazywa się przechodzeniem do kolejnego przypadku (ang. fall-through). Świadomie używa się go, gdy kilka wartości ma wspólny kod, np. case 10: case 20:. Zwykle jednak każdy case kończy się break.
Dlatego przy pisaniu własnego kodu nie należy zapominać o tej instrukcji.
Najczęstszy błąd to założenie, że switch wykona tylko instrukcje pierwszego pasującego case i zatrzyma się na 11. Tak działa if z elseif, ale w switch koniec przypadku wyznacza dopiero break. Bez niego wykonanie przechodzi do następnych instrukcji, choć 11 nie jest równe 20.
Wynik 0 pojawiłby się, gdyby wykonanie dotarło do default. Zatrzymuje je jednak break stojący w przypadku dla 20. Wynik 10 oznaczałby, że żadna instrukcja nie zmieniła zmiennej, a pasujący case 10 na pewno się wykonał.
Wartość rośnie więc dwa razy i kod wyświetla 12. Przy analizie każdego switch warto szukać miejsc, w których brakuje break.
Najpewniej jest prześledzić kod linijka po linijce i zapisywać wartość zmiennej po każdej instrukcji, zamiast zakładać, że wykona się tylko jeden przypadek.