0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p><strong>Выражение match разветвляет поток исполнения кода в PHP. Но практически тем же занимается и оператор switch. Разбираемся, чем они отличаются друг от друга и в каких случаях лучше применять именно match.</strong></p>
1
<p><strong>Выражение match разветвляет поток исполнения кода в PHP. Но практически тем же занимается и оператор switch. Разбираемся, чем они отличаются друг от друга и в каких случаях лучше применять именно match.</strong></p>
2
<blockquote><p>Эта статья больше подходит для тех, кто уже немного знает основы PHP. Если вы еще не разобрались с ним, советуем перед прочтением пройти большую<a>профессию по PHP</a>на Хекслете.</p>
2
<blockquote><p>Эта статья больше подходит для тех, кто уже немного знает основы PHP. Если вы еще не разобрались с ним, советуем перед прочтением пройти большую<a>профессию по PHP</a>на Хекслете.</p>
3
</blockquote><p>Выражение match разветвляет поток исполнения кода через проверку совпадения значения с заданным условием. Как и оператор switch, match принимает на вход выражение, которое сравнивается с множеством альтернатив. Только в отличие от switch, оно возвращает значение, похожее на тернарный оператор.</p>
3
</blockquote><p>Выражение match разветвляет поток исполнения кода через проверку совпадения значения с заданным условием. Как и оператор switch, match принимает на вход выражение, которое сравнивается с множеством альтернатив. Только в отличие от switch, оно возвращает значение, похожее на тернарный оператор.</p>
4
<p>Выражение match появилось<a>в восьмой версии PHP</a>. Оно выполняет практически те же задачи, что и switch, но имеет ряд преимуществ.</p>
4
<p>Выражение match появилось<a>в восьмой версии PHP</a>. Оно выполняет практически те же задачи, что и switch, но имеет ряд преимуществ.</p>
5
<p>Рассмотрим пример использования выражения match:</p>
5
<p>Рассмотрим пример использования выражения match:</p>
6
<p>Если заменить в этом примере match на блок switch, код будет длиннее:</p>
6
<p>Если заменить в этом примере match на блок switch, код будет длиннее:</p>
7
<p>Давайте более подробно поговорим о том, как работает выражение match.</p>
7
<p>Давайте более подробно поговорим о том, как работает выражение match.</p>
8
<h2>Содержание</h2>
8
<h2>Содержание</h2>
9
<ul><li><a>Возврат значения</a></li>
9
<ul><li><a>Возврат значения</a></li>
10
<li><a>Множественные условия</a></li>
10
<li><a>Множественные условия</a></li>
11
<li><a>Однострочные выражения</a></li>
11
<li><a>Однострочные выражения</a></li>
12
<li><a>Отсутствие оператора break</a></li>
12
<li><a>Отсутствие оператора break</a></li>
13
<li><a>Шаблон default</a></li>
13
<li><a>Шаблон default</a></li>
14
<li><a>Отсутствие совпадений</a></li>
14
<li><a>Отсутствие совпадений</a></li>
15
<li><a>Исключение UnhandledMatchError</a></li>
15
<li><a>Исключение UnhandledMatchError</a></li>
16
<li><a>Строгое сравнение без приведения типов</a></li>
16
<li><a>Строгое сравнение без приведения типов</a></li>
17
<li><a>Сравнение с произвольными выражениями</a></li>
17
<li><a>Сравнение с произвольными выражениями</a></li>
18
<li><a>Чем различаются match и switch</a></li>
18
<li><a>Чем различаются match и switch</a></li>
19
<li><a>С какими версиями PHP совместим match</a></li>
19
<li><a>С какими версиями PHP совместим match</a></li>
20
<li><a>Что выбрать: match или switch</a></li>
20
<li><a>Что выбрать: match или switch</a></li>
21
</ul><h2>Возврат значения</h2>
21
</ul><h2>Возврат значения</h2>
22
<p>В отличие от switch, выражение match возвращает результат - возвращаемое значение каждой ветви можно сохранить в переменной. Как и в случае с секциями case в блоках switch.</p>
22
<p>В отличие от switch, выражение match возвращает результат - возвращаемое значение каждой ветви можно сохранить в переменной. Как и в случае с секциями case в блоках switch.</p>
23
<h2>Множественные условия</h2>
23
<h2>Множественные условия</h2>
24
<p>Для выражения match можно задать несколько условий, указав их через запятую. Тогда выражение будет похоже на каскад секций case в блоке switch.</p>
24
<p>Для выражения match можно задать несколько условий, указав их через запятую. Тогда выражение будет похоже на каскад секций case в блоке switch.</p>
25
<p>Для условий $case === 'two' или $case === 'three' будет возвращено значение ’bazz’.</p>
25
<p>Для условий $case === 'two' или $case === 'three' будет возвращено значение ’bazz’.</p>
26
<h2>Однострочные выражения</h2>
26
<h2>Однострочные выражения</h2>
27
<p>В отличие от блоков switch, которые содержат произвольное количество выражений, в каждой ветви match есть только одно выражение. Поэтому так делать нельзя:</p>
27
<p>В отличие от блоков switch, которые содержат произвольное количество выражений, в каждой ветви match есть только одно выражение. Поэтому так делать нельзя:</p>
28
<h2>Отсутствие оператора break</h2>
28
<h2>Отсутствие оператора break</h2>
29
<p>Выражение match выполняет только первую ветвь алгоритма, который соответствует условию. В отличие от оператора switch, в match сквозное исполнение не происходит.</p>
29
<p>Выражение match выполняет только первую ветвь алгоритма, который соответствует условию. В отличие от оператора switch, в match сквозное исполнение не происходит.</p>
30
<p>А чтобы при использовании switch не забыть о ключевом слове break, PHP продолжает исполнять команды следующей секции case:</p>
30
<p>А чтобы при использовании switch не забыть о ключевом слове break, PHP продолжает исполнять команды следующей секции case:</p>
31
<p>Здесь мы пропустили оператор break. В результате сквозного исполнения кода выполняется и функция sendNuclearAlert(), хотя этого не должно было произойти.</p>
31
<p>Здесь мы пропустили оператор break. В результате сквозного исполнения кода выполняется и функция sendNuclearAlert(), хотя этого не должно было произойти.</p>
32
<p>Для выражения match не требуется ключевое слово break. Оно выполняет одну ветвь, возвращает значение и останавливается:</p>
32
<p>Для выражения match не требуется ключевое слово break. Оно выполняет одну ветвь, возвращает значение и останавливается:</p>
33
<blockquote><h3>Читайте также:</h3>
33
<blockquote><h3>Читайте также:</h3>
34
<p>"Комьюнити у PHP сейчас одно из самых активных": интервью c разработчиком Yii Framework<a>Александром Макаровым</a></p>
34
<p>"Комьюнити у PHP сейчас одно из самых активных": интервью c разработчиком Yii Framework<a>Александром Макаровым</a></p>
35
</blockquote><h2>Шаблон default</h2>
35
</blockquote><h2>Шаблон default</h2>
36
<p>Для выражения match можно задать шаблон default, аналогично похожей конструкции в блоке switch.</p>
36
<p>Для выражения match можно задать шаблон default, аналогично похожей конструкции в блоке switch.</p>
37
<p>Ветвь default совпадает со всеми условиями, которым не нашлось других совпадений.</p>
37
<p>Ветвь default совпадает со всеми условиями, которым не нашлось других совпадений.</p>
38
<h2>Отсутствие совпадений</h2>
38
<h2>Отсутствие совпадений</h2>
39
<p>Если блок switch не обнаруживает совпадения, то PHP продолжает выполнять код. Выражение match носит исчерпывающий характер. Если совпадения не найдены, и нет конструкции default, выражение выдает исключение \UnhandledMatchError.</p>
39
<p>Если блок switch не обнаруживает совпадения, то PHP продолжает выполнять код. Выражение match носит исчерпывающий характер. Если совпадения не найдены, и нет конструкции default, выражение выдает исключение \UnhandledMatchError.</p>
40
<p>Если ввести такое выражение match, получим ошибку:</p>
40
<p>Если ввести такое выражение match, получим ошибку:</p>
41
<h2>Исключение UnhandledMatchError</h2>
41
<h2>Исключение UnhandledMatchError</h2>
42
<p>Если проверяемое выражение не совпало ни с одним из условий, выбрасывается исключение \UnhandledMatchError.</p>
42
<p>Если проверяемое выражение не совпало ни с одним из условий, выбрасывается исключение \UnhandledMatchError.</p>
43
<p>Это подвид \Error, новый класс исключений в PHP 8. Почитать о структуре базовых исключений PHP, включая новые классы, можно<a>в этой статье</a>.</p>
43
<p>Это подвид \Error, новый класс исключений в PHP 8. Почитать о структуре базовых исключений PHP, включая новые классы, можно<a>в этой статье</a>.</p>
44
<p>Добавить эту функциональность в предыдущие версии PHP можно с помощью полифилла:</p>
44
<p>Добавить эту функциональность в предыдущие версии PHP можно с помощью полифилла:</p>
45
<h2>Строгое сравнение без приведения типов</h2>
45
<h2>Строгое сравнение без приведения типов</h2>
46
<p>Одна из особенностей выражения match заключается в том, что оно не только сравнивает значение, но и учитывает тип выражения.</p>
46
<p>Одна из особенностей выражения match заключается в том, что оно не только сравнивает значение, но и учитывает тип выражения.</p>
47
<p>Блок switch использует слабое сравнение (==) и приводит типы к нужному значению. В выражениях match все ветви кода, соответствующие условию, подлежат строгому сравнению (===). Это защищает разработчиков от ошибок.</p>
47
<p>Блок switch использует слабое сравнение (==) и приводит типы к нужному значению. В выражениях match все ветви кода, соответствующие условию, подлежат строгому сравнению (===). Это защищает разработчиков от ошибок.</p>
48
<p>В примере выше каждая ветвь проверяется на предмет соответствия значения и типа.</p>
48
<p>В примере выше каждая ветвь проверяется на предмет соответствия значения и типа.</p>
49
<blockquote><h3>Читайте также:</h3>
49
<blockquote><h3>Читайте также:</h3>
50
<p>Как работать<a>с базами данных в PHP</a>с помощью модуля PDO</p>
50
<p>Как работать<a>с базами данных в PHP</a>с помощью модуля PDO</p>
51
</blockquote><h2>Сравнение с произвольными выражениями</h2>
51
</blockquote><h2>Сравнение с произвольными выражениями</h2>
52
<p>match позволяет сравнить значение с выражением.</p>
52
<p>match позволяет сравнить значение с выражением.</p>
53
<p>Здесь match ищет совпадение для $foo в следующем порядке:</p>
53
<p>Здесь match ищет совпадение для $foo в следующем порядке:</p>
54
<ol><li>$foo === 404</li>
54
<ol><li>$foo === 404</li>
55
<li>$foo === Response::REDIRECT</li>
55
<li>$foo === Response::REDIRECT</li>
56
<li>$foo === $client->getCode()</li>
56
<li>$foo === $client->getCode()</li>
57
<li>$foo === $response->getCode()</li>
57
<li>$foo === $response->getCode()</li>
58
<li>default</li>
58
<li>default</li>
59
</ol><p>Проверка кода завершится, как только будет обнаружено совпадение.</p>
59
</ol><p>Проверка кода завершится, как только будет обнаружено совпадение.</p>
60
<h2>Чем различаются match и switch</h2>
60
<h2>Чем различаются match и switch</h2>
61
<h2>С какими версиями PHP совместим match</h2>
61
<h2>С какими версиями PHP совместим match</h2>
62
<p>Код с выражением match работает только в PHP версии 8.0 и новее. Для более ранних версий можно бэкпортировать класс исключений \UnhandledMatchError.</p>
62
<p>Код с выражением match работает только в PHP версии 8.0 и новее. Для более ранних версий можно бэкпортировать класс исключений \UnhandledMatchError.</p>
63
<p>Если выполнить код с выражением match в предыдущих версиях PHP, возникнет ошибка анализа:</p>
63
<p>Если выполнить код с выражением match в предыдущих версиях PHP, возникнет ошибка анализа:</p>
64
<h2>Что выбрать: match или switch</h2>
64
<h2>Что выбрать: match или switch</h2>
65
<p>Итак, выражение match - это более строгая и современная альтернатива для оператора switch.</p>
65
<p>Итак, выражение match - это более строгая и современная альтернатива для оператора switch.</p>
66
<p>В некоторых случаях switch более универсален, особенно если нужно использовать многострочные блоки кода. Но у этого оператора много недостатков, которые исправлены в match. В целом match выигрывает благодаря точности и более широким возможностям сопоставления с переданным значением.</p>
66
<p>В некоторых случаях switch более универсален, особенно если нужно использовать многострочные блоки кода. Но у этого оператора много недостатков, которые исправлены в match. В целом match выигрывает благодаря точности и более широким возможностям сопоставления с переданным значением.</p>
67
<blockquote><h3>Станьте профессиональным PHP-разработчиком с нуля за 10 месяцев</h3>
67
<blockquote><h3>Станьте профессиональным PHP-разработчиком с нуля за 10 месяцев</h3>
68
<p>На Хекслете есть<a>профессия "PHP-разработчик"</a>. Пройдите ее, чтобы изучить один из самых известных языков программирования, освоить популярные фреймворки и создать большое портфолио с проектами на GitHub.</p>
68
<p>На Хекслете есть<a>профессия "PHP-разработчик"</a>. Пройдите ее, чтобы изучить один из самых известных языков программирования, освоить популярные фреймворки и создать большое портфолио с проектами на GitHub.</p>
69
</blockquote>
69
</blockquote>