match в PHP 8: понятная замена switch с практическими примерами
match в PHP 8 — это конструкция для выбора значения по условию. Она похожа на switch, но работает строже, короче и часто безопаснее. Если вы пишете код на современном PHP, match стоит освоить как один из базовых инструментов для обработки статусов, ролей, кодов ошибок, тарифов и других ветвлений.
Что такое match в PHP 8
match — это выражение, то есть оно возвращает значение. Поэтому результат можно сразу присвоить переменной, вернуть из функции или передать дальше.
<?php
$status = 'paid';
$message = match ($status) {
'new' => 'Заказ создан',
'paid' => 'Заказ оплачен',
'cancelled' => 'Заказ отменён',
default => 'Неизвестный статус',
};
echo $message; // Заказ оплачен
Ключевой поисковый запрос этой статьи — match в PHP 8. Именно его чаще всего вводят разработчики, когда хотят понять, чем новая конструкция отличается от switch и как применять её на практике.
Главные отличия match от switch
matchвозвращает значение, аswitchпросто выполняет блок кода.matchиспользует строгое сравнение, как===.- В
matchнет проваливания в следующий case, поэтому не нуженbreak. - Если подходящая ветка не найдена и нет
default, PHP выбросит ошибкуUnhandledMatchError.
Пример: замена switch на match
Сначала посмотрим на классический вариант через switch:
<?php
$role = 'admin';
switch ($role) {
case 'admin':
$access = 'Полный доступ';
break;
case 'manager':
$access = 'Доступ к заказам';
break;
case 'user':
$access = 'Личный кабинет';
break;
default:
$access = 'Нет доступа';
}
echo $access;
Теперь тот же код через match:
<?php
$role = 'admin';
$access = match ($role) {
'admin' => 'Полный доступ',
'manager' => 'Доступ к заказам',
'user' => 'Личный кабинет',
default => 'Нет доступа',
};
echo $access;
Второй вариант короче и читается как таблица соответствий: значение слева — результат справа.
Строгое сравнение: важное отличие
Одна из причин использовать match — предсказуемость. В отличие от switch, он сравнивает значения строго.
<?php
$value = '1';
$result = match ($value) {
1 => 'Число один',
'1' => 'Строка один',
default => 'Другое значение',
};
echo $result; // Строка один
Это особенно полезно при обработке данных из форм, API и базы данных, где число 1 и строка '1' могут иметь разный смысл.
Несколько значений в одной ветке
Если несколько вариантов должны давать один результат, перечислите их через запятую.
<?php
$httpCode = 404;
$type = match ($httpCode) {
200, 201 => 'Успешный ответ',
400, 401, 403, 404 => 'Ошибка клиента',
500, 502, 503 => 'Ошибка сервера',
default => 'Неизвестный код',
};
echo $type;
Такой подход удобно использовать для HTTP-кодов, ролей пользователей, статусов заказов и категорий ошибок.
match (true): проверки диапазонов и условий
Обычно match сравнивает конкретное значение. Но иногда нужно проверить диапазон: например, определить скидку по сумме заказа. Для этого используют приём match (true).
<?php
$total = 7500;
$discount = match (true) {
$total >= 10000 => 15,
$total >= 5000 => 10,
$total >= 1000 => 5,
default => 0,
};
echo 'Скидка: ' . $discount . '%';
Важно: PHP проверяет ветки сверху вниз. Поэтому условия нужно располагать от более специфичных к более общим. Если поставить $total >= 1000 первым, остальные условия уже не сработают.
Практический пример: валидация поля формы
Рассмотрим простой пример: пользователь вводит возраст, а мы хотим вывести понятное сообщение.
<?php
$age = 17;
$message = match (true) {
$age < 0 => 'Возраст не может быть отрицательным',
$age < 18 => 'Доступ только с 18 лет',
$age <= 120 => 'Возраст принят',
default => 'Проверьте корректность возраста',
};
echo $message;
Такой код компактнее длинной цепочки if / elseif, но остаётся понятным. Главное — не превращать match в сложную головоломку с десятками условий.
Ошибка UnhandledMatchError
Если match не найдёт подходящую ветку и не будет default, возникнет ошибка.
<?php
$status = 'archived';
$text = match ($status) {
'new' => 'Новый',
'paid' => 'Оплачен',
};
// Fatal error: UnhandledMatchError
В учебных примерах это может быть полезно: ошибка сразу показывает, что вы забыли обработать вариант. Но в реальном приложении чаще добавляют default или заранее валидируют данные.
Когда использовать match, а когда if
match хорошо подходит, когда вы выбираете одно значение из набора вариантов:
- название статуса по коду;
- сообщение по роли пользователя;
- класс CSS по типу уведомления;
- размер скидки по диапазону суммы;
- обработчик по типу действия.
А вот если внутри веток нужно выполнять много действий: отправлять письма, писать в лог, менять несколько объектов — чаще лучше использовать if, отдельные функции или классы.
Советы и лучшие практики
- Используйте
matchдля вычисления значения, а не для длинных сценариев с побочными эффектами. - Добавляйте
default, если входные данные приходят от пользователя или внешнего API. - Помните про строгое сравнение:
1и'1'— разные значения. - В
match (true)ставьте более строгие условия выше. - Не бойтесь заменить громоздкий
switchнаmatch, если результатом каждой ветки является одно значение.
Если вы хотите не просто выучить отдельные конструкции, а уверенно собрать полноценный сайт с авторизацией, базой данных и практическими задачами, посмотрите курс PHP и MySQL с нуля до уверенной разработки. Он хорошо дополняет изучение таких тем, как match, формы, работа с БД и архитектура PHP-приложений.
Итог
match в PHP 8 — удобная современная альтернатива switch для ситуаций, где нужно выбрать и вернуть значение. Он короче, использует строгое сравнение, не требует break и помогает писать более предсказуемый код. Начните с простых таблиц соответствий, затем используйте match (true) для диапазонов — и ваши условия в PHP станут чище и понятнее.
-
Создано 07.10.2026 17:00:44
-
Михаил Русаков

Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.