Как использовать выражение match в PHP и чем оно отличается от switch

Выражение match
разветвляет поток исполнения кода в PHP. Но практически тем же занимается и оператор switch
. Разбираемся, чем они отличаются друг от друга и в каких случаях лучше применять именно match
.
Эта статья больше подходит для тех, кто уже немного знает основы PHP. Если вы еще не разобрались с ним, советуем перед прочтением пройти большую профессию по PHP на Хекслете.
Выражение match
разветвляет поток исполнения кода через проверку совпадения значения с заданным условием. Как и оператор switch
, match
принимает на вход выражение, которое сравнивается с множеством альтернатив. Только в отличие от switch
, оно возвращает значение, похожее на тернарный оператор.
Выражение match
появилось в восьмой версии PHP. Оно выполняет практически те же задачи, что и switch
, но имеет ряд преимуществ.
Рассмотрим пример использования выражения match
:
Если заменить в этом примере match
на блок switch
, код будет длиннее:
Давайте более подробно поговорим о том, как работает выражение match
.
Содержание
- Возврат значения
- Множественные условия
- Однострочные выражения
- Отсутствие оператора
break
- Шаблон
default
- Отсутствие совпадений
- Исключение
UnhandledMatchError
- Строгое сравнение без приведения типов
- Сравнение с произвольными выражениями
- Чем различаются
match
иswitch
- С какими версиями PHP совместим
match
- Что выбрать:
match
илиswitch
Возврат значения
В отличие от switch
, выражение match
возвращает результат — возвращаемое значение каждой ветви можно сохранить в переменной. Как и в случае с секциями case
в блоках switch
.
Множественные условия
Для выражения match
можно задать несколько условий, указав их через запятую. Тогда выражение будет похоже на каскад секций case
в блоке switch
.
Для условий $case === 'two'
или $case === 'three'
будет возвращено значение ’bazz’
.
Однострочные выражения
В отличие от блоков switch
, которые содержат произвольное количество выражений, в каждой ветви match
есть только одно выражение. Поэтому так делать нельзя:
Отсутствие оператора break
Выражение match
выполняет только первую ветвь алгоритма, который соответствует условию. В отличие от оператора switch
, в match
сквозное исполнение не происходит.
А чтобы при использовании switch
не забыть о ключевом слове break
, PHP продолжает исполнять команды следующей секции case
:
Здесь мы пропустили оператор break
. В результате сквозного исполнения кода выполняется и функция sendNuclearAlert()
, хотя этого не должно было произойти.
Для выражения match
не требуется ключевое слово break
. Оно выполняет одну ветвь, возвращает значение и останавливается:
Читайте также:
«Комьюнити у PHP сейчас одно из самых активных»: интервью c разработчиком Yii Framework Александром Макаровым
Шаблон default
Для выражения match
можно задать шаблон default
, аналогично похожей конструкции в блоке switch
.
Ветвь default
совпадает со всеми условиями, которым не нашлось других совпадений.
Отсутствие совпадений
Если блок switch
не обнаруживает совпадения, то PHP продолжает выполнять код. Выражение match
носит исчерпывающий характер. Если совпадения не найдены, и нет конструкции default
, выражение выдает исключение \UnhandledMatchError
.
Если ввести такое выражение match
, получим ошибку:
Исключение UnhandledMatchError
Если проверяемое выражение не совпало ни с одним из условий, выбрасывается исключение \UnhandledMatchError
.
Это подвид \Error
, новый класс исключений в PHP 8. Почитать о структуре базовых исключений PHP, включая новые классы, можно в этой статье.
Добавить эту функциональность в предыдущие версии PHP можно с помощью полифилла:
Строгое сравнение без приведения типов
Одна из особенностей выражения match
заключается в том, что оно не только сравнивает значение, но и учитывает тип выражения.
Блок switch
использует слабое сравнение (==)
и приводит типы к нужному значению. В выражениях match
все ветви кода, соответствующие условию, подлежат строгому сравнению (===)
. Это защищает разработчиков от ошибок.
В примере выше каждая ветвь проверяется на предмет соответствия значения и типа.
Читайте также:
Как работать с базами данных в PHP с помощью модуля PDO
Сравнение с произвольными выражениями
match
позволяет сравнить значение с выражением.
Здесь match
ищет совпадение для $foo
в следующем порядке:
$foo === 404
$foo === Response::REDIRECT
$foo === $client->getCode()
$foo === $response->getCode()
default
Проверка кода завершится, как только будет обнаружено совпадение.
Чем различаются match
и switch
С какими версиями PHP совместим match
Код с выражением match
работает только в PHP версии 8.0 и новее. Для более ранних версий можно бэкпортировать класс исключений \UnhandledMatchError
.
Если выполнить код с выражением match
в предыдущих версиях PHP, возникнет ошибка анализа:
Что выбрать: match
или switch
Итак, выражение match
— это более строгая и современная альтернатива для оператора switch
.
В некоторых случаях switch
более универсален, особенно если нужно использовать многострочные блоки кода. Но у этого оператора много недостатков, которые исправлены в match
. В целом match
выигрывает благодаря точности и более широким возможностям сопоставления с переданным значением.
Станьте профессиональным PHP-разработчиком с нуля за 10 месяцев
На Хекслете есть профессия «PHP-разработчик». Пройдите ее, чтобы изучить один из самых известных языков программирования, освоить популярные фреймворки и создать большое портфолио с проектами на GitHub.
Алексей Покровский
2 года назад