W3docs

Оператор 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

Ключевые различия:

switchmatch
Сравнениенестрогое (==)строгое (===)
Сквозное выполнениеда (требует 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, когда проверяются разные выражения, а не одно значение против множества.

Связанные темы

Практика

Практика
Какие операторы можно использовать внутри оператора switch в PHP?
Какие операторы можно использовать внутри оператора switch в PHP?
Was this page helpful?