PHP | Конструкции 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 = "число"

НазадСодержаниеВперед

Конструкция switch-case в PHP | Трепачёв Дмитрий

В PHP есть специальная конструкция switch-case, которая используется для выбора одного значения из некоторого ряда значений.

Изучите ее синтаксис:

<?php switch (переменная) { case 'значение1': /* здесь код, который выполнится в случае, если переменная имеет значение1 */ break; case 'значение2': /* здесь код, который выполнится в случае, если переменная имеет значение2 */ break; case 'значение3': /* здесь код, который выполнится в случае, если переменная имеет значение3 */ break; default: /* здесь код, который выполнится в случае, если не совпала ни с одним значением */ break; } ?>

Как вы можете заметить, switch-case представляет собой альтернативу множеству elseif. Давайте посмотрим на примере. Пусть у нас есть вот такой код:

<?php $lang = 'ru'; if ($lang === 'ru') { echo 'рус'; } elseif ($lang === 'en') { echo 'анг'; } elseif ($lang === 'de') { echo 'нем'; } else { echo 'язык не поддерживается'; } ?>

Перепишем этот код через конструкцию switch-case:

<?php $lang = 'ru'; switch ($lang) { case 'ru': echo 'рус'; break; case 'en': echo 'англ'; break; case 'de': echo 'нем'; break; default: echo 'язык не поддерживается'; break; } ?>

Переменная $num может принимать значения 1, 2, 3 или 4. Определите, в какую пору года попадает значение этой переменной.

Необязательность default

Блок default является необязательным. Давайте его уберем из предыдущего кода:

<?php $lang = 'ru'; switch ($lang) { case 'ru': echo 'рус'; break; case 'en': echo 'англ'; break; case 'de': echo 'нем'; break; } ?>

Необязательность break

Команда break является необязательной. Без нее, однако, поведение блоков case будет неожиданным. Давайте посмотрим на примере. Пусть у нас есть вот такой код:

<?php $num = 1; switch ($num) { case 1: echo 1; break; case 2: echo 2; break; case 3: echo 3; break; } ?>

Уберем в нем все break, а в переменную $num для начала запишем число 3.

Пока все будет работать так, как и работало:

<?php $num = 3; // пусть здесь число 3 switch ($num) { case 1: echo 1; case 2: echo 2; case 3: echo 3; } // После запуска код выведет 3 - все хорошо ?>

Давайте теперь в переменную $num запишем число 2. В этом случае у нас ожидаемо выполнится case 2, а затем неожиданно еще и case 3:

<?php $num = 2; switch ($num) { case 1: echo 1; case 2: echo 2; case 3: echo 3; } // После запуска код выведет 2, а затем 3 ?>

Если же в переменную $num записать число 1, то вообще выполнятся все конструкции case:

<?php $num = 1; switch ($num) { case 1: echo 1; case 2: echo 2; case 3: echo 3; } // После запуска код выведет 1, затем 2, а затем 3 ?>

То есть получается, что при отсутствии break после выполнения задуманного case, выполнятся и все case ниже него. Иногда такую особенность используют, при решении задач.

В следующем примере, если переменная $num имеет значение 1 или 2, то в переменную $result запишется 'a'. Если же переменная $num имеет значение 3, то в переменную $result запишется 'b':

<?php $num = 1; switch ($num) { case 1: case 2: $result = 'a'; break; case 3: $result = 'b'; break; } echo $result; ?>

Выше я написал, что иногда такую особенность используют, но я, в общем-то, не рекомендую ей пользоваться, так как код становится не очень очевидным.

Очевиднее решить такую задачу через ифы:

<?php $num = 1; if ($num == 1 or $num == 2) { $result = 'a'; } if ($num == 3) { $result = 'b'; } echo $result; ?>

Как использовать оператор Switch PHP

В этом руководстве я расскажу, как использовать оператор switch в PHP.

Использование оператора switch — отличная альтернатива использованию последовательности операторов if и elseif. В этом уроке мы объясним, почему вы можете предпочесть один из них другому.

Есть довольно много уникальных особенностей оператора switch, которые вам необходимо знать, если вы планируете их использовать. Например, операторы switch выполняются построчно. Если вы не используете оператор break, переключатель будет выполнять весь код после совпадения, пока не достигнет конца переключателя. Мы объясним это более подробно далее.

Вы можете вкладывать операторы switch друг в друга, но это не рекомендуется, так как это может затруднить чтение и понимание кода.

В этом руководстве будет рассказано, как написать оператор switch на PHP, а также рассмотрены некоторые основы, которые вам необходимо знать. Мы также коснемся сравнения операторов switch с операторами if-else.

Содержание

  • Оператор switch Синтаксис
  • switch vs if else
  • Как использовать оператор switch в PHP
    • Написание основного оператора переключателя
    • Оператор по умолчанию
    • Объединение операторов случае но вам нужно будет знать несколько вещей о том, как они работают.

      Переключатель принимает выражение, которое будет вычисляться только один раз. В большинстве случаев выражение представляет собой переменную, которую PHP сравнивает с операторами case в структуре switch. Как только совпадение будет найдено, будет выполнен блок кода, связанный с оператором case.

      Переключатель может иметь много операторов case в PHP, но рекомендуется свести их к минимуму, так как большое количество операторов case может затруднить чтение кода.

      Операторы break необязательны, но без них PHP будет выполнять весь код после совпадения, пока не встретит оператор break или конец блока switch.

      В конце переключателя можно указать оператор по умолчанию, который будет выполняться только в том случае, если выражение не соответствует ни одному оператору case. Оператор по умолчанию является необязательным и может быть исключен из переключателя, если он вам не нужен.

      После каждого оператора case вместо обычного двоеточия можно использовать точку с запятой. Однако мы рекомендуем использовать двоеточие, так как это делает код более читабельным.

      В качестве альтернативы вы можете написать оператор switch, используя switch(i): и завершить его endswitch . Пример ниже демонстрирует альтернативный синтаксис переключателя в PHP.

      switch и if-else

      В этом разделе сравниваются различия между switch и серией операторов if и elseif.

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

      Наиболее значительным преимуществом использования переключателя является удобство чтения. Переключатель может быть намного проще для чтения и понимания, чем последовательность операторов if-else и elseif. Тем не менее, читаемость все еще может зависеть от личных предпочтений.

      Выбор того, когда использовать оператор switch вместо ряда операторов if-else и elseif, в основном сводится к предпочтениям. Со временем вы научитесь использовать одно вместо другого. Обычно для сложных условий я использую серию if-else. Для простых сравнений я использую переключатель.

      Ниже приведен переключатель и ряд операторов if-else и elseif. Оба приведут к одному и тому же результату.

      Как использовать оператор switch в PHP

      Разработчик сам решает, когда использовать оператор switch в коде PHP. Как правило, хорошо использовать переключатель, когда у вас есть несколько сравнений одного и того же выражения с разными значениями. Хорошо продуманный переключатель намного легче понять, чем сложную структуру if-else и elseif.

      Ниже мы рассмотрим несколько различных способов написания оператора switch.

      Написание базового оператора switch

      В этом примере мы создаем базовый оператор switch, который сравнивает строку с несколькими различными операторами case в коммутаторе. Я объясню процесс кода ниже.

      Сначала мы создаем переменную с именем $fruit для хранения нашей строки « Apple ». Далее идет наш переключатель, где мы указываем нашу переменную в качестве выражения. Выражение будет вычислено один раз.

      Теперь PHP будет сравнивать значение выражения с каждым значением в наших операторах case. Наша строка соответствует третьему оператору case, содержащему строку « Apple ».

      PHP выполнит блок кода в нашем соответствующем операторе case. Блок кода содержит оператор echo и оператор break. Оператор echo выведет строку, а оператор break приведет к принудительному выходу из коммутатора.

      Вывод ниже показывает, что наш $fruit 9Переменная 0054 соответствует оператору case « Apple ».

      Заявление по умолчанию

      В нашем примере ниже у нас есть переключатель, который использует целые числа, а не строки. Переменная ( $num ), которую мы будем использовать в выражении, имеет значение 0 и не будет соответствовать ни одному из наших операторов case в переключателе. В результате будет запущен блок кода по умолчанию .

      Поскольку наша переменная $num не соответствует ни одному оператору case, по умолчанию кодовый блок будет запущен, и вы получите вывод ниже. Если у вас нет оператора по умолчанию, ничего не будет выведено.

      Объединение операторов case

      Если у вас один и тот же результат для нескольких операторов case, вы можете объединить их и уменьшить повторение кода. В нашем примере ниже у нас есть один и тот же вывод для трех разных случаев: лимон, линия и апельсин.

      Приведенный выше код привел к следующему результату, потому что наша переменная соответствует одному из первых трех операторов case, которые используют один и тот же блок кода. У нас есть эхо внутри блока кода, которое выводит следующий текст.

      Использование операторов break

      Вы можете использовать операторы break для управления тем, как оператор switch обрабатывает совпадения. Например, если разрыва не существует, переключатель будет выполнять каждый блок кода от первого совпадения до конца.

      В следующем примере наша строка будет соответствовать первому оператору case. Однако операторов break нет, пока наш оператор case не проверит « Orange ». Поскольку операторов break нет, PHP выполнит первые три оператора echo.

      В приведенном ниже выводе показано, как переключатель обрабатывает блоки кода оператора case без оператора break. Очень важно помнить об этом при написании операторов switch на PHP.

      Вложенные операторы Switch

      Последняя тема, которую я хочу затронуть, это вложенные операторы switch. Вы можете вкладывать операторы switch, но это не рекомендуется, так как это может привести к беспорядку и быстрому чтению.

      Ниже приведен пример двух вложенных операторов switch в PHP.

      В приведенном выше коде есть переменная ( $fruit ), которая соответствует первому оператору case (« Lemon ») в нашем внешнем переключателе. У него также есть вторая переменная ( $vegetable ), которая соответствует последнему оператору case (« Carrot ») в нашем первом вложенном переключателе. Полученный результат ниже.

      Заключение

      Я надеюсь, что это руководство показало вам все основы использования оператора switch в PHP. Это чрезвычайно полезный способ контролировать выполнение кода и помочь сделать код понятным для других разработчиков.

      Если вы хотите узнать больше о программировании на PHP, я рекомендую ознакомиться с нашим постоянно растущим ассортиментом руководств по PHP. Мы охватываем такие темы, как циклы for, циклы while, if-else и другие. Учебники идеально подходят как для начинающих, так и для продвинутых разработчиков.

      Если вы заметили, что мы можем улучшить это руководство, не стесняйтесь сообщить нам об этом, оставив комментарий ниже.

      Основное руководство по оператору switch в PHP с примерами

      Резюме : в этом руководстве вы узнаете об операторе switch в PHP, который выполняет блок кода, сопоставляя выражение с несколькими значениями.

      Знакомство с оператором PHP switch

      Когда значение одной переменной определяет количество различных вариантов, вы можете использовать оператор if. ..elseif .

      Предположим, вы создаете веб-сайт, пользователи которого имеют множество ролей, таких как администратор, редактор, автор и подписчик.

      В следующем примере оператор if elseif используется для отображения другого сообщения в зависимости от роли пользователя:

        Язык кода: HTML, XML (xml)  

      Вывод:

       Добро пожаловать! Ознакомьтесь с некоторыми новыми статьями.  Язык кода: JavaScript (javascript)  

      Когда значение одной переменной указывает количество различных вариантов, гораздо чище использовать оператор switch следующим образом:

        ';
      перерыв;
      по умолчанию:
      $message = 'У вас нет прав доступа к этой странице';
      }
      эхо $сообщение;  Язык кода: HTML, XML (xml)  

      Ниже показан синтаксис оператора switch :

        Язык кода: HTML, XML (xml)  

      Оператор switch сравнивает выражение со значением в каждом случае.

      Если выражение равно значению в случае, например, значение1 , PHP выполняет блок кода в соответствующем случае, пока не встретит первый оператор break .

      Если совпадений нет и доступно значение по умолчанию , PHP выполняет все операторы, следующие за ключевым словом по умолчанию .

      В случае, если по умолчанию не указан и совпадений нет, управление передается оператору, следующему за оператором switch .

      Следующая блок-схема иллюстрирует, как работает оператор switch :

      Объединение случаев

      Поскольку PHP выполняет оператор switch от соответствующей метки case до тех пор, пока не встретит оператор break , вы можете объединить несколько случаев в один.

      Следующий пример использует оператор switch и объединяет случаи 'редактор' и 'автор' :

        Язык кода: HTML, XML (xml)  

      Вывод:

       Добро пожаловать! Вы хотите создать новую статью?  Язык кода: PHP (php)  

      В этом примере, если роль является редактором или автором, будет показано то же сообщение.