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.
Связанные главы
- PHP if...else...elseif — ветвление при различных условиях
- PHP break и break vs. continue — управление потоком выполнения
- PHP операторы — операторы сравнения и равенства
- PHP циклы — повторяющиеся блоки кода