Оператор PHP switch с case и блоком default

Оператор PHP switch сравнивает одно выражение со списком значений case и выполняет первую совпавшую ветку. Используйте его, когда переменная может принимать одно из нескольких фиксированных значений и для каждого значения нужна разная логика. Группировка нескольких меток case (каждая такая метка - оператор case в PHP) в одной ветке избавляет от повторяющихся условий в длинных цепочках if/elseif.

Пример PHP switch для сопоставления значений

Вывод:

Результат появится здесь...

Вывод:

Запись ресурса

Как работает этот пример

  1. switch ($method) вычисляет $method один раз и сравнивает результат с каждым значением case, используя нестрогое сравнение (==).
  2. case "GET" не совпадает с "POST", поэтому выполнение переходит к следующему case.
  3. case "POST" совпадает. Поскольку после этой метки нет break, выполнение проваливается в блок case "PUT" - так оба метода группируются в одной ветке.
  4. break выходит из switch после вывода. Без него выполнение продолжилось бы в default.
  5. 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

switchmatch (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.