Оператор PHP switch с case и блоком default
Оператор PHP switch сравнивает одно выражение со списком значений case и выполняет первую совпавшую ветку. Используйте его, когда переменная может принимать одно из нескольких фиксированных значений и для каждого значения нужна разная логика. Группировка нескольких меток case (каждая такая метка - оператор case в PHP) в одной ветке избавляет от повторяющихся условий в длинных цепочках if/elseif.
Пример PHP switch для сопоставления значений
Вывод:
Результат появится здесь...
Вывод:
Запись ресурса
Как работает этот пример
switch ($method)вычисляет$methodодин раз и сравнивает результат с каждым значениемcase, используя нестрогое сравнение (==).case "GET"не совпадает с"POST", поэтому выполнение переходит к следующему case.case "POST"совпадает. Поскольку после этой метки нетbreak, выполнение проваливается в блокcase "PUT"- так оба метода группируются в одной ветке.breakвыходит из switch после вывода. Без него выполнение продолжилось бы вdefault.defaultработает как общий fallback, когда ни один case не совпал. Он необязателен, но рекомендуется для защитного кода.
PHP switch использует строгое или нестрогое сравнение?
PHP switch использует нестрогое сравнение (==), поэтому при сопоставлении возможны приведения типов. Частая ловушка: "0" совпадает с case 0, и false тоже совпадает с case 0. Порядок case важен: побеждает первое нестрого равное совпадение. Когда нужно строгое сравнение, используйте match (PHP 8+) или явные if/elseif с ===.
Частые ошибки в PHP switch
Отсутствует break (случайный fall-through):
Неправильно:
$role = "админ";
switch ($role) {
case "админ":
$label = "админ";
case "редактор":
$label = "редактор";
break;
}
Правильно:
$role = "админ";
switch ($role) {
case "админ":
$label = "админ";
break;
case "редактор":
$label = "редактор";
break;
}
Без break совпавший case продолжает выполнять следующие ветки. Осознанный fall-through должен группировать метки без кода между ними.
Использовать continue внутри цикла, ожидая переход к следующей итерации:
Неправильно:
$items = ["оставить", "пропустить", "оставить"];
foreach ($items as $item) {
switch ($item) {
case "пропустить":
continue; // выходит из switch, а не из цикла
}
echo $item . "\\n";
}
Правильно:
$items = ["оставить", "пропустить", "оставить"];
foreach ($items as $item) {
switch ($item) {
case "пропустить":
continue 2; // переходит к следующей итерации foreach
}
echo $item . "\\n";
}
Внутри switch, вложенного в цикл, continue ведет себя как break для switch. Используйте continue 2, чтобы обратиться к внешнему циклу.
PHP switch vs выражение match
| switch | match (PHP 8+) |
|---|---|
| Оператор, который не возвращает значение | Выражение, которое возвращает значение |
Нестрогое сравнение (==) | Строгое сравнение (===) |
| Fall-through по умолчанию | Нет fall-through; каждая ветка возвращает результат |
| Поддерживает многострочные блоки в каждом case | Одно выражение на ветку |
Используйте switch, когда ветки содержат несколько операторов или когда намеренный fall-through объединяет case. Используйте match, когда нужно сопоставить значение с результатом при строгой типобезопасности.
FAQ
Почему в операторе PHP switch нужен break?
PHP switch по умолчанию использует fall-through: после совпадения case выполняются все следующие ветки, пока не встретится break или не закончится блок switch. Оператор break немедленно завершает switch. Пропускать его безопасно только при намеренной группировке case с общей логикой.
Когда в PHP 8+ стоит использовать match вместо switch?
Выбирайте match, когда нужно строгое сравнение, нужно присвоить результат переменной или каждая ветка состоит из одного выражения. Оставайтесь на switch, когда ветки содержат несколько операторов, побочные эффекты или намеренный fall-through между case.