Конструкции switch и match
Конструкция switch..case
Конструкция 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
match
Начиная с версии 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 = "число"