Оператор switch в PHP: подробное руководство
Оператор switch в PHP позволяет сравнивать одно выражение с несколькими значениями и управлять потоком выполнения программы.
Оператор switch в PHP сравнивает одно выражение со списком возможных значений и выполняет блок, который совпадает с результатом. Это более чистая альтернатива длинной цепочке операторов if...elseif...else, когда вы проверяете одну и ту же переменную против множества фиксированных значений.
На этой странице рассматривается синтаксис, принципы сравнения и сквозного выполнения (fall-through), реальные рабочие примеры, альтернатива match в PHP 8, а также типичные ошибки.
Синтаксис
switch (expression) {
case value1:
// runs when expression == value1
break;
case value2:
// runs when expression == value2
break;
default:
// runs when nothing above matched
}expression вычисляется один раз. Результат затем сравнивается сверху вниз с каждым значением case с использованием нестрогого сравнения (==). При первом совпадении PHP начинает выполнять операторы с этого case и продолжает до тех пор, пока не встретит break (или конец switch). Необязательный блок default выполняется, когда ни один case не совпал — по соглашению он располагается последним.
Рабочий пример
Этот пример сопоставляет номер дня с его названием и выводит результат:
<?php
$day = 3;
switch ($day) {
case 1:
echo "Monday";
break;
case 2:
echo "Tuesday";
break;
case 3:
echo "Wednesday";
break;
default:
echo "Another day";
}
// Output: WednesdayПоскольку $day равно 3, совпадает третий case, выводится "Wednesday", и break останавливает выполнение до блока default.
Почему важен break: сквозное выполнение (fall-through)
Если забыть break, выполнение «проваливается» в следующий case и продолжается до тех пор, пока не встретит один из них. Это наиболее распространённая ошибка при использовании switch:
<?php
$role = "editor";
switch ($role) {
case "editor":
echo "Can edit. ";
// no break — falls through!
case "viewer":
echo "Can view.";
break;
}
// Output: Can edit. Can view.Здесь совпало значение "editor", но без break PHP также выполнил блок viewer.
Намеренное сквозное выполнение (группировка case)
Иногда сквозное выполнение используется намеренно: несколько пустых case позволяют нескольким значениям совместно использовать один блок.
<?php
$letter = "e";
switch ($letter) {
case "a":
case "e":
case "i":
case "o":
case "u":
echo "Vowel";
break;
default:
echo "Consonant";
}
// Output: VowelПроверка условия с помощью true
switch также может заменить лестницу if...elseif для проверки диапазонов. Укажите true в качестве выражения и разместите логические выражения в каждом case:
<?php
$score = 82;
switch (true) {
case $score >= 90:
echo "A";
break;
case $score >= 80:
echo "B";
break;
case $score >= 70:
echo "C";
break;
default:
echo "F";
}
// Output: BПервый case, чьё выражение равно true, побеждает, поэтому порядок важен — сначала указывайте наиболее строгое условие.
switch и match (PHP 8+)
В PHP 8 было добавлено выражение match — более строгий аналог switch. Используйте match, когда нужно просто сопоставить значение с результатом:
<?php
$status = 404;
$message = match ($status) {
200, 201 => "Success",
404 => "Not Found",
500 => "Server Error",
default => "Unknown",
};
echo $message;
// Output: Not FoundКлючевые различия:
switch | match | |
|---|---|---|
| Сравнение | нестрогое (==) | строгое (===) |
| Сквозное выполнение | да (требует break) | отсутствует |
| Возвращает значение | нет | да (это выражение) |
Нет совпадения и нет default | ничего не делает | выбрасывает UnhandledMatchError |
Проблема нестрогого сравнения
Поскольку switch использует ==, числовой 0 может совпасть с непустой строкой в старом коде. В PHP 8+ правила сравнения строк с числами были ужесточены, но для надёжности сохраняйте согласованность типов:
<?php
$value = 0;
switch ($value) {
case "hello":
echo "matched hello";
break;
default:
echo "no match";
}
// Output (PHP 8+): no matchВ PHP 7 тот же код вывел бы matched hello, так как 0 == "hello" было true. При возникновении сомнений используйте match для строгого сравнения.
Лучшие практики
- Всегда добавляйте
breakпосле каждого case, если только намеренно не хотите сквозного выполнения (и в этом случае прокомментируйте это). - Включайте
defaultдля обработки неожиданных значений вместо молчаливого бездействия. - Группируйте связанные case, располагая пустые метки
caseстопкой, вместо дублирования кода. - Предпочитайте
match(PHP 8+), когда возвращается значение или требуется строгое сравнение. - Используйте
if...elseif, когда проверяются разные выражения, а не одно значение против множества.
Связанные темы
- PHP If...Else...Elseif — условное ветвление
- PHP Операторы — сравнение и выражение
match - PHP Циклы — повторяющиеся блоки кода