Конструкция switch..case
является альтернативой использованию конструкции if..elseif..else
.
Оператор switch получает некоторое выражение и сравнивает его с набором значений:
switch (выражение){ case значение1: действия; break; case значение2: действия; break; //........................... case значениеN: действия; break; }
После ключевого слова switch в скобках идет сравниваемое выражение. Значение этого выражения последовательно сравнивается со значениями, помещенными после операторов сase. И если совпадение будет найдено, то будет выполняться определенный блок сase.
Конструкция switch может содержать произвольное количество операторов case. В конце блока сase ставится оператор break, чтобы избежать выполнения других блоков.
Весь блок switch помещается в фигурные скобки, однако блок каждого отдельного оператора case НЕ помещается в фигурные скобки.
Например, возьмем следующую конструкцию if..elseif..else
:
$a = 3; if($a==1) echo "сложение"; elseif($a==2) echo "вычитание"; elseif($a==3) echo "умножение"; elseif($a==4) echo "деление";
Теперь перепишем ее с помощь конструкции switch..case
:
$a = 3; switch($a) { case 1: echo "сложение"; break; case 2: echo "вычитание"; break; case 3: echo "умножение"; break; case 4: echo "деление"; break; }
То есть на вход в конструкцию switch передается переменная $a<
, и ее значение последовательно сравнивается со значениями,
указанными после операторов case
. Так, в данном случае переменная $a
равна 3, поэтому выполнение дойдет до блока
case 3: echo "умножение"; break;
и этот блок и будет выполняться.
Если мы хотим также обработать ситуацию, когда совпадения не будет найдено, то можно добавить блок default:
$a = 3; switch($a) { case 1: echo "сложение"; break; case 2: echo "вычитание"; break; default: echo "действие по умолчанию"; break; }
Конструкция switch..case
также поддерживает альтернативный синтаксис, при котором вместо открывающей блок фигурной скобки
ставится двоеточие, а вместо закрывающей фигурной скобки - ключевое слово endswitch:
$a = 3; switch($a): case 1: echo "сложение"; break; case 2: echo "вычитание"; break; default: echo "действие по умолчанию"; break; endswitch
Начиная с версии 8.0 в PHP была добавлена поддержка другой, похожей конструкции - match. Она позволяет оптимизировать
конструкцию switch
. Конструкция match также принимает некоторое выражение и сравнивает его с набором значений.
Например, пусть у нас есть следующий код:
$a = 2; switch($a) { case 1: $operation = "сложение"; break; case 2: $operation = "вычитание"; break; default: $operation = "действие по умолчанию"; break; } echo $operation;
Перепишем этот пример с использованием match:
$a = 2; $operation = match($a) { 1 => "сложение", 2 => "вычитание", default => "действие по умолчанию", }; echo $operation;
Итак, match
в скобках также принимает некоторое сравниваемое выражение (в данном случае это переменная $a). Сам блок кода match
также обертывается в фигурные скобки, однако в конце после закрывающей фигурной скобки необходимо поставить точку с запятой.
А вместо операторов case
просто указываются значения, с которыми сравнивается выражение.
Но в отличие от switch
, конструкция match возвращает некоторый результат.
Поэтому после каждого сравнимого значения ставится оператор =>, после которого идет возвращаемый результат.
То есть в данном случае переменная $a
равна 2, поэтому в конструкции match будет выполнять блок
2 => "вычитание",
Этот блок установит в качестве возвращаемого результата строку "вычитание"
.
Поскольку конструкция match возвращает результат, то этот результат мы можем присвоить другой переменной:
$operation = match($a){ //................. }
В итоге в переменной $operation
будет храниться строка "вычитание"
.
Также мы можем переписать предыдущий пример следующим образом:
$a = 2; match($a) { 1 => $operation = "сложение", 2 => $operation = "вычитание", default => $operation = "действие по умолчанию", }; echo $operation;
Стоит отметить важное отличие конструкции switch от match: switch сравнивает только значение, но не учитывает тип выражения. Тогда как match также учитывает тип сравниваемого выражения. Рассмотрим разницу на примере. Пусть есть следующая конструкция switch:
switch (8.0) { case "8.0": $result = "строка"; break; case 8.0: $result = "число"; break; } echo $result; // строка
В конструкцию switch передается в качестве выажения число 8.0, но с точки зрения внутренней логики конструкции switch это выражение также соответствует строке "8.0". Поэтому в данном случае будет выполняться блок
case "8.0": $result = "строка"; break;
Теперь посмотрим, что будет в аналогичном примере с match:
match (8.0) { "8.0" => $result = "строка", 8.0 => $result = "число" }; echo $result; // число
Конструкция match также будет учитывать тип выражения, а тип в данном случае float, поэтому будет выполняься блок:
8.0 => $result = "число"