switch ($value) porównuje jedną wartość z listą etykiet case i wykonuje kod pod pierwszą pasującą etykietą. Każdy case kończy się break; default obsługuje wszystko, co do niczego nie pasowało.
Ustaw $day na 'fri', 'sun' albo 'wed' i uruchom ponownie. Case default nie potrzebuje break, gdy jest ostatni.
Kilka case dla jednego bloku
Aby wykonać ten sam kod dla kilku wartości, ustaw etykiety case jedna pod drugą bez niczego między nimi. Pasująca etykieta przechodzi do kodu poniżej.
W przeciwieństwie do match switch nie ma składni z przecinkiem case 'jpg', 'jpeg':. Etykiety jedna pod drugą to jedyny sposób.
Przechodzenie: co się dzieje bez break
To break zatrzymuje switch. Bez niego PHP wykonuje pasujący case, a potem idzie dalej do każdego case poniżej, ignorując ich etykiety, aż trafi na break albo koniec.
Tutaj przechodzenie jest celowe: każdy plan dostaje własne funkcje oraz wszystko z tańszych planów. Gdy piszesz tak świadomie, dodaj komentarz w rodzaju // no break, żeby następny czytelnik tego nie „naprawił”. Gdy nie było to zamierzone, brakujący break to jeden z najczęstszych błędów w switch.
switch używa luźnego porównania (==)
Każdy case jest sprawdzany przez ==, a nie ===. Łańcuch liczbowy pasuje do liczby, null pasuje do false i "", a true pasuje do każdej wartości, która liczy się jako prawda. Klikaj komórki, aby porównać oba operatory.
| $a == $b | 0 | 1 | "0" | "1" | "" | null | false | true | "a" | "10" | "1e1" |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | |||||||||||
| 1 | |||||||||||
| "0" | |||||||||||
| "1" | |||||||||||
| "" | |||||||||||
| null | |||||||||||
| false | |||||||||||
| true | |||||||||||
| "a" | |||||||||||
| "10" | |||||||||||
| "1e1" |
Praktyczna konsekwencja: łańcuch "1" z formularza trafia do case 1: bez żadnej konwersji, co często jest tym, czego chcesz. Ale switch (true) z niepustym łańcuchem albo null spotykające case false: mogą wybrać case, którego się nie spodziewałeś.
Zwróć uwagę na linię z null: nigdy nie dociera do case false:, bo null == 0 jest już prawdą, a case 0: stoi wcześniej. Przy luźnym porównaniu kolejność case zmienia wynik. Od PHP 8 0 == "a" jest fałszem (w PHP 7 było prawdą), więc łańcuch nieliczbowy nie pasuje już do case 0:. Jeśli potrzebujesz ===, użyj wyrażenia match, opisanego na końcu tej strony.
switch(true) dla zakresów i warunków
Etykieta case może być dowolnym wyrażeniem. W switch (true) każdy case to warunek, a wygrywa pierwszy, który jest równy true.
Upewnij się, że każdy case jest prawdziwą wartością logiczną. Przez luźne porównanie case $name: pasowałoby zawsze, gdy $name jest niepustym łańcuchem.
switch w pętli: break i continue
W pętli break w switch opuszcza tylko switch, a nie pętlę. Aby zatrzymać pętlę, użyj break 2. continue w switch działa jak break, a PHP ostrzega przy kompilacji: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?. Napisz continue 2, aby przejść do następnej iteracji pętli.
switch vs match
PHP 8 dodał match, który obejmuje większość zastosowań switch przy mniejszej ilości kodu. Porównuje przez ===, zwraca wartość, nigdy nie przechodzi do kolejnych gałęzi, pozwala na warunki rozdzielone przecinkami i rzuca UnhandledMatchError, gdy nic nie pasuje, więc zapomniany case nie przejdzie po cichu.
Zostań przy switch, gdy case potrzebuje kilku instrukcji albo gdy przechodzenie jest celem, jak w przykładzie z planami. Do mapowania wartości na wynik match jest krótszy i bezpieczniejszy.
Najczęściej zadawane pytania
Jak użyć kilku case dla jednego bloku w switch w PHP?
Ustaw etykiety case jedna pod drugą bez kodu między nimi: case 'sat': case 'sun': echo 'weekend'; break;. Każda etykieta przechodzi do wspólnego kodu. PHP nie ma dla switch składni case 'sat', 'sun':; ta forma z przecinkiem należy do match.
Czy switch w PHP używa ścisłego porównania?
Nie. switch porównuje luźnym ==, więc case '1': pasuje do liczby całkowitej 1, a case 0: do '0'. Do ścisłego porównania === użyj wyrażenia match albo switch (true) z === w każdym case.
Co się stanie, jeśli zapomnę break w switch w PHP?
Wykonanie przechodzi dalej: po pasującym case PHP wykonuje kod każdego case poniżej, aż trafi na break, return albo koniec switch. Czasem jest to zamierzone, ale zwykle to błąd.
Czy switch w PHP może sprawdzać zakresy, na przykład większe niż?
Tak, przez switch (true): każdy case zawiera warunek, taki jak case $score >= 90:, i wykonuje się pierwszy prawdziwy. Wyrażenie match (true) robi to samo ze ścisłym porównaniem i zwraca wartość.