Инструкции switch и match
Используйте switch и match из PHP 8 для логики с несколькими ветвями.
«Инструкции switch и match» — бесплатный урок PHP Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.
Switch и цепочки if
Если у Вас много ветвей, зависящих от значения одной переменной, switch выглядит понятнее длинной цепочки if/elseif.
В PHP 8 появился match — современная строгая альтернатива.
Основы оператора switch
Оператор switch один раз вычисляет выражение и выполняет блок подходящего варианта:
<?php
$day = 'Monday';
switch ($day) {
case 'Monday':
echo 'Start of work week';
break;
case 'Friday':
echo 'Almost weekend';
break;
default:
echo 'Midweek';
}Поведение с проваливанием
Без break выполнение проваливается в следующий вариант — это удобный приём для намеренного объединения вариантов:
<?php
$status = 2;
switch ($status) {
case 1:
case 2:
case 3:
echo 'In progress'; // runs for 1, 2, or 3
break;
case 4:
echo 'Done';
break;
}Switch использует нестрогое сравнение
Switch внутри использует == (нестрогое сравнение) — это может приводить к неожиданным совпадениям:
<?php
$val = 0;
switch ($val) {
case 'foo': // 0 == 'foo' in PHP 7!
echo 'match foo';
break;
case 0:
echo 'match zero'; // PHP 8 fixes this
break;
}
// PHP 8: match zero (fixed)
// PHP 7: match foo (bug!)Выражение match в PHP 8
match похож на switch, но использует строгое сравнение, возвращает значение и не требует break:
<?php
$status = 'active';
$label = match($status) {
'active' => 'Currently active',
'inactive' => 'Not active',
'pending' => 'Awaiting activation',
default => 'Unknown status',
};
echo $label; // Currently activematch без совпадения вызывает исключение
Если в match не совпал ни один вариант и нет default, возникает исключение UnhandledMatchError:
<?php
$code = 99;
try {
$result = match($code) {
200 => 'OK',
404 => 'Not Found',
500 => 'Server Error',
// no default!
};
} catch (\UnhandledMatchError $e) {
echo 'Unhandled match value: ' . $code;
}match с несколькими условиями
Один вариант match может содержать несколько значений, разделённых запятыми:
<?php
$lang = 'tr';
$region = match($lang) {
'en', 'en-US', 'en-GB' => 'English',
'tr', 'az' => 'Turkic',
'fr', 'be', 'ca' => 'French-speaking',
default => 'Other',
};
echo $region; // Turkicmatch со сложными выражениями
В правой части вариантов match можно использовать произвольные выражения:
<?php
$score = 85;
$grade = match(true) {
$score >= 90 => 'A',
$score >= 80 => 'B', // matches
$score >= 70 => 'C',
default => 'F',
};
echo $grade; // BВозврат из match
Поскольку match является выражением, его можно использовать везде, где ожидается значение:
<?php
function getHttpMessage(int $code): string {
return match($code) {
200 => 'OK',
201 => 'Created',
400 => 'Bad Request',
401 => 'Unauthorized',
404 => 'Not Found',
default => 'Unknown',
};
}
echo getHttpMessage(404); // Not Foundswitch в контексте возврата
switch можно использовать внутри функции для возврата разных значений, но match выглядит понятнее:
<?php
function describe(int $n): string {
switch (true) {
case $n < 0: return 'negative';
case $n === 0: return 'zero';
default: return 'positive';
}
}
echo describe(-5); // negative
echo describe(0); // zero
echo describe(7); // positiveКогда использовать switch, а когда match
Рекомендации по выбору:
- Используйте
match, когда нужны строгое сравнение и возвращаемое значение (PHP 8+) - Используйте
switchдля группировки с проваливанием или при поддержке PHP 7 - Оба варианта понятнее длинных цепочек if/elseif при ветвлении по нескольким значениям
Быстрая проверка
Что происходит в выражении match, если ни один вариант не совпал и значение по умолчанию не задано?
Повторение: switch и match
Основные различия:
switch— нестрогое сравнение, проваливание, PHP 4+match— строгое сравнение, без проваливания, возвращает значение, PHP 8+- При отсутствии значения по умолчанию match вызывает
UnhandledMatchError - Варианты match принимают несколько значений, разделённых запятыми
Далее: циклы for и while.
Часто задаваемые вопросы
Урок «Инструкции switch и match» бесплатный?
Да — полный текст урока «Инструкции switch и match» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.
Чему я научусь в уроке «Инструкции switch и match»?
Используйте switch и match из PHP 8 для логики с несколькими ветвями. Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать PHP Academy?
Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Инструкции switch и match»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке PHP Academy?
Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- if, elseif и else
- Инструкции switch и match
- Циклы for и while
- foreach и управление циклами