W3docs

switch

В PHP оператор "switch" используется для вычисления значения и выполнения различных действий в зависимости от него. Это альтернатива множеству "if"

Оператор switch в PHP

Оператор switch в PHP вычисляет одно выражение и выполняет блок кода, соответствующий его значению. Это более чистая альтернатива длинной цепочке операторов if / elseif / else, когда вы сравниваете одну и ту же переменную со многими возможными значениями.

В этой главе рассматриваются синтаксис, важнейшее ключевое слово break, намеренный проваль (fall-through), альтернативный синтаксис endswitch и ловушка нестрогого сравнения, с которой сталкиваются большинство новичков.

Синтаксис

Базовый синтаксис оператора switch в PHP выглядит следующим образом:

<?php
switch ($value) {
  case $value1:
    // Code block here
    break;
  case $value2:
    // Code block here
    break;
  default:
    // Code block here
}

PHP сравнивает $value с каждым case сверху вниз. Первое совпадение выигрывает: выполняется его блок, а break завершает switch. Если ни один case не совпал, выполняется необязательный блок default. default не обязательно должен быть последним, но размещение его в конце — общепринятое соглашение.

Зачем нужен break

Оператор break останавливает выполнение и выходит из блока switch. Без него PHP продолжает выполнять код в каждом следующем case до тех пор, пока не встретит break или конец блока — это поведение называется fall-through (проваль). Это самая распространённая ошибка при использовании switch:

<?php
$role = "editor";

switch ($role) {
  case "admin":
    echo "Full access. ";
    // no break — execution "falls through" to the next case
  case "editor":
    echo "Can edit content. ";
    break;
  case "viewer":
    echo "Read only.";
    break;
}
// Output: Can edit content.

Здесь совпадает editor, выводится его сообщение, и break корректно завершает выполнение. Если забыть break после admin, администратор продолжит выполнять код editor тоже. Подробнее о ключевом слове — в разделе break.

Намеренный проваль (fall-through)

Проваль — не всегда ошибка. Стопка пустых меток case позволяет нескольким значениям использовать один блок — это удобный способ группировки условий:

<?php
$month = 2;

switch ($month) {
  case 12:
  case 1:
  case 2:
    echo "Winter";
    break;
  case 3:
  case 4:
  case 5:
    echo "Spring";
    break;
  default:
    echo "Another season";
}
// Output: Winter

Примеры

Рассмотрим несколько практических примеров использования switch:

<?php

// Example 1
$dayOfWeek = "Wednesday";

switch ($dayOfWeek) {
  case "Monday":
  case "Tuesday":
  case "Wednesday":
  case "Thursday":
  case "Friday":
    echo "It's a weekday.";
    break;
  case "Saturday":
  case "Sunday":
    echo "It's a weekend.";
    break;
}

// Example 2
$grade = "B";

switch ($grade) {
  case "A":
    echo "Excellent!";
    break;
  case "B":
    echo "Good job!";
    break;
  case "C":
    echo "Could do better.";
    break;
  default:
    echo "Please enter a valid grade.";
}

Пример 1 группирует названия дней недели с помощью стопки меток case, чтобы определить будний или выходной день. Пример 2 сопоставляет буквенную оценку с сообщением обратной связи, а default перехватывает любое несовпадающее значение.

Ловушка нестрогого сравнения

По умолчанию switch сравнивает с нестрогим равенством (==), поэтому значения сравниваются после приведения типов, а не с помощью строгого ===. Это может давать неожиданные совпадения:

<?php
$value = "1";

switch ($value) {
  case 1:
    echo "Matched the integer 1!";
    break;
  default:
    echo "Matched default.";
}
// Output: Matched the integer 1!

Строка "1" совпадает с целочисленным case 1, потому что == преобразует типы перед сравнением. Когда нужна строгая проверка типов, используйте цепочку if / elseif с === или выражение match (PHP 8+), которое сравнивает строго и возвращает значение:

<?php
$grade = "B";

$message = match ($grade) {
  "A" => "Excellent!",
  "B" => "Good job!",
  "C" => "Could do better.",
  default => "Please enter a valid grade.",
};

echo $message;
// Output: Good job!

У match нет провала и не нужен break, что устраняет целый класс ошибок.

Альтернативный синтаксис endswitch

При встраивании PHP в HTML-шаблоны форма с двоеточием и endswitch может выглядеть более естественно:

<?php switch ($status): ?>
  <?php case "active": ?>
    <span>Active</span>
    <?php break; ?>
  <?php default: ?>
    <span>Inactive</span>
<?php endswitch; ?>

Преимущества

  • Читаемость — один switch проще просматривать, чем множество операторов if, когда вы сравниваете одну переменную с несколькими значениями.
  • Однократное вычисление — выражение в switch вычисляется один раз, затем сравнивается с каждым case.

Связанные главы

Практика

Практика
Согласно содержимому страницы на w3docs.com, в каких случаях можно использовать оператор 'switch' в PHP?
Согласно содержимому страницы на w3docs.com, в каких случаях можно использовать оператор 'switch' в PHP?
Was this page helpful?