Конструкции switch и match

Последнее обновление: 07.03.2021

Конструкция 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 = "число"
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850