Switch in function php

Switch in function php

Конструкция switch..case является альтернативой использованию конструкции if..elseif..else . Оператор switch получает некоторое выражение и сравнивает его с набором значений:

После ключевого слова 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 :

То есть на вход в конструкцию switch передается переменная $a , и ее значение последовательно сравнивается со значениями, указанными после операторов case . Так, в данном случае переменная $a равна 3, поэтому выполнение дойдет до блока

case 3: echo "умножение"; break;

и этот блок и будет выполняться.

Если мы хотим также обработать ситуацию, когда совпадения не будет найдено, то можно добавить блок default :

Конструкция 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 будет выполнять блок

Этот блок установит в качестве возвращаемого результата строку «вычитание» .

Поскольку конструкция match возвращает результат, то этот результат мы можем присвоить другой переменной:

В итоге в переменной $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, поэтому будет выполняься блок:

Читайте также:  Php curl отправить put

Источник

switch

Оператор switch подобен серии операторов IF с одинаковым условием. Во многих случаях вам может понадобиться сравнивать одну и ту же переменную (или выражение) с множеством различных значений, и выполнять различные участки кода в зависимости от того, какое значение принимает эта переменная (или выражение). Это именно тот случай, для которого удобен оператор switch.

Замечание: Обратите внимание, что в отличие от некоторых других языков, оператор continue применяется в конструкциях switch и действует подобно оператору break. Если у вас конструкция switch находится внутри цикла, и вам необходимо перейти к следующей итерации цикла, используйте continue 2.

Замечание:

Заметьте, что конструкция swich/case использует неточное сравнение (==).

Следующие два примера иллюстрируют два различных способа написать то же самое. Один использует серию операторов if и elseif, а другой — оператор switch:

Пример #1 Оператор switch

if ( $i == 0 ) echo «i равно 0» ;
> elseif ( $i == 1 ) echo «i равно 1» ;
> elseif ( $i == 2 ) echo «i равно 2» ;
>

switch ( $i ) case 0 :
echo «i равно 0» ;
break;
case 1 :
echo «i равно 1» ;
break;
case 2 :
echo «i равно 2» ;
break;
>
?>

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

switch ( $i ) case «яблоко» :
echo «i это яблоко» ;
break;
case «шоколадка» :
echo «i это шоколадка» ;
break;
case «пирог» :
echo «i это пирог» ;
break;
>
?>

Важно понять, как оператор switch выполняется, чтобы избежать ошибок. Оператор switch исполняет строчка за строчкой (на самом деле выражение за выражением). В начале никакой код не исполняется. Только в случае нахождения оператора case, значение которого совпадает со значением выражения в операторе switch, PHP начинает исполнять операторы. PHP продолжает исполнять операторы до конца блока switch либо до тех пор, пока не встретит оператор break. Если вы не напишете оператор break в конце секции case, PHP будет продолжать исполнять команды следующей секции case. Например :

switch ( $i ) case 0 :
echo «i равно 0» ;
case 1 :
echo «i равно 1» ;
case 2 :
echo «i равно 2» ;
>
?>

В этом примере, если $i равно 0, то PHP исполнит все операторы echo! Если $i равно 1, PHP исполнит два последних оператора echo. Вы получите ожидаемое поведение оператора (‘i равно 2’ будет отображено) только, если $i будет равно 2. Таким образом, важно не забывать об операторах break (даже если вы, возможно, хотите избежать его использования по назначению при определенных обстоятельствах).

Читайте также:  Make grid with css

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

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

switch ( $i ) case 0 :
case 1 :
case 2 :
echo «i меньше чем 3, но неотрицательно» ;
break;
case 3 :
echo «i равно 3» ;
>
?>

Специальный вид конструкции case — default. Сюда управление попадает тогда, когда не сработал ни один из других операторов case. Например:

switch ( $i ) case 0 :
echo «i равно 0» ;
break;
case 1 :
echo «i равно 1» ;
break;
case 2 :
echo «i равно 2» ;
break;
default:
echo «i не равно 0, 1 или 2» ;
>
?>

Выражением в операторе case может быть любое выражение, которое приводится в простой тип, то есть в тип integer, или в тип с плавающей точкой (float), или строку. Массивы или объекты не могут быть здесь использованы до тех пор, пока они не будут разыменованы до простого типа.

Возможен альтернативный синтаксис для управляющей структуры switch. Для более детальной информации, см. Альтернативный синтаксис для управляющих структур.

switch ( $i ):
case 0 :
echo «i равно 0» ;
break;
case 1 :
echo «i равно 1» ;
break;
case 2 :
echo «i равно 2» ;
break;
default:
echo «i не равно to 0, 1 или 2» ;
endswitch;
?>

Возможно использование точки с запятой вместо двоеточия после оператора case. К примеру :

switch( $beer )
case ‘tuborg’ ;
case ‘carlsberg’ ;
case ‘heineken’ ;
echo ‘Хороший выбор’ ;
break;
default;
echo ‘Пожалуйста, сделайте новый выбор. ‘ ;
break;
>
?>

Источник

The PHP switch statement

This post is part of a series of posts about the fundamentals of PHP.

In the previous article we discussed the if statement, where it said you can have many different elseif statements if you wanted to handle many different scenarios, but it gets to a point where you should consider swapping to a switch statement.

$myVar = 'green'; if ($myVar === 'red')  echo 'It is red'; > elseif ($myVar === 'blue')  echo 'It is blue'; > elseif ($myVar === 'green')  echo 'It is green'; > 

This can be rewritten using a switch statement. Each condition you want to match has a case where you pass in the variable you want to match. Within the case, you put the code you want to run if the condition matches. Then you need to add a break, otherwise the code will continue to check for matches in the rest of the switch statement.

$myVar = 'green'; switch ($myVar)  case 'red': echo 'It is red'; break; case 'blue': echo 'It is blue'; break; case 'green': echo 'It is green'; break; > 

Default case

A very useful feature of the switch statement is allowing a default if none of the other cases match. Sometimes you don’t know what the variable will be and it allows you to catch this edge case. You could even use it to throw an exception to deliberately stop any further code running.

$myVar = 'orange'; switch ($myVar)  case 'red': echo 'It is red'; break; case 'blue': echo 'It is blue'; break; case 'green': echo 'It is green'; break; default: throw new Exception('It is not a matching colour'); > // Fatal error: Uncaught Exception: It is not a matching colour 

Multiple case matching

Sometimes you want to do the same thing for multiple matching cases. If you were to use an if statement you would need to either repeat the code multiple times or use an or ( || ) in your condition.

$myVar = 'green'; if ($myVar === 'red' || $myVar === 'green')  echo 'It is red or green'; > 

In a switch statement you can do this easily by listing multiple cases one after the other, then adding your code to run with a break after;

$myVar = 'green'; switch ($myVar)  case 'red': case 'green': echo 'It is red or green'; break; case 'blue': echo 'It is blue'; break; > 

Returning from a switch case

Sometimes you don’t need a break in a switch statement. This is when you directly return from the switch statement. The example below has a switch statement in a function, returning the result from the matching case.

function findTheColour($colour)  switch ($colour)  case 'red': return 'It is red'; case 'blue': return 'It is blue'; case 'green': return 'It is green'; default: return 'It does not match'; > > echo findTheColour('green'); // It is green 

I know that some developers (such as me) think it looks strange not having the breaks in a switch statement as it’s nice to break up the code.

Alternative syntax

As with an if statement, you can also use colons instead of brackets and end the switch with endswitch.

switch ($myVar): case 'red': echo 'It is red'; break; case 'blue': echo 'It is blue'; break; case 'green': echo 'It is green'; break; endswitch; 

You can also use semicolons instead of colons after the case if you wanted to.

Using an Array instead

Some people don’t like using switch statements as they can seem a bit verbose. There is a potential alternative using an array to provide the options if it is a simple scenario.

$colours = [ 'red' => 'It is red', 'green' => 'It is green', 'blue' => 'It is blue', ]; $myVar = 'green'; echo $colours[$myVar]; //It is green 

The above will work fine for red, green or blue, but if it is an unknown colour, such as orange, then you will end up with an undefined index error.

You could use a null coalescing operator (PHP 7.0 onwards) to catch this error and return a default response.

echo $colours[$myVar] ?? 'It does not match'; 

Match

PHP 8.0 has introduced the match statement. It offers shorter syntax and it returns a value. There is a great article about the differences between match and switch on stitcher.io by Brent.

Источник

Оцените статью