Конструкция match в PHP
Конструкция match
это новая конструкция, введенная в PHP 8.0, предназначенная для улучшения читаемости и эргономики кода при сопоставлении значений. Она предоставляет более короткую и читаемую альтернативу switch
и case
, делая код более лаконичным и легко поддерживаемым.
Основные преимущества использования match
:
- Нет необходимости в break для прекращения выполнения кода в каждом блоке условий
- Строгая типизация: не происходит неявных преобразований типов
- Чтение кода становится проще и его объем уменьшается
Базовый пример:
$number = 1;
$result = match( $number )
{
0 => 'ноль',
1 => 'один',
2 => 'два',
default => 'нет совпадений'
};
// выведет один
echo $result;
Пример с множественными значениями:
$day = 'Суббота';
$result = match( $day )
{
'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница' => 'Будний день',
'Суббота', 'Воскресенье' => 'Выходной',
default => 'Неизвестный день'
};
// выведет Выходной
echo $result;
Пример с использованием выражений:
$age = 25;
$category = match( true )
{
$age >= 60 => 'Пожилой',
$age >= 18 => 'Взрослый',
default => 'Молодой'
};
// выведет "Взрослый"
echo $category;
Сравнение значений и типов
Стоит отметить важное отличие конструкции 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 = "число"