HTML Diff
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-&gt;getCode()</li>
56 <li>$foo === $client-&gt;getCode()</li>
57 <li>$foo === $response-&gt;getCode()</li>
57 <li>$foo === $response-&gt;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>