← Назад к вопросам

Чем отличается match от case?

1.0 Junior🔥 111 комментариев
#PHP Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Отличие операторов match и case в PHP

В PHP операторы match и case являются частью двух разных конструкций управления потоком: switch-case и оператора match, появившегося в PHP 8.0. Они выполняют схожие функции — сопоставление значений — но имеют фундаментальные различия в синтаксисе, поведении и возможностях.

Ключевые различия

1. Синтаксис и структура

  • case используется исключительно внутри конструкции switch.
  • match — это самостоятельный оператор, который возвращает значение.
// Традиционный switch-case
switch ($status) {
    case 'pending':
        $color = 'yellow';
        break;
    case 'approved':
        $color = 'green';
        break;
    default:
        $color = 'gray';
}

// Оператор match (PHP 8+)
$color = match ($status) {
    'pending' => 'yellow',
    'approved' => 'green',
    default => 'gray',
};

2. Возвращение значения

  • switch-case не возвращает значение напрямую. Это управляющая конструкция, которая выполняет блоки кода.
  • match всегда возвращает значение, что позволяет использовать его как выражение.
// match возвращает значение, которое можно сразу присвоить
$action = match ($command) {
    'start' => startProcess(),
    'stop' => stopProcess(),
    default => logUnknownCommand(),
};

// switch требует отдельной переменной и break
$action = null;
switch ($command) {
    case 'start':
        $action = startProcess();
        break;
    case 'stop':
        $action = stopProcess();
        break;
    default:
        $action = logUnknownCommand();
}

3. Тип сравнения

  • switch-case использует слабое сравнение (loose comparison) аналогично ==. Это может привести к неожиданным сопоставлениям.
  • match использует строгое сравнение (strict comparison) аналогично ===. Это более безопасно и предсказуемо.
$value = 0;

switch ($value) {
    case false: // Сработает, потому что 0 == false
        echo 'switch: Это false!';
        break;
}

echo match ($value) {
    false => 'match: Это false!', // Не сработает, потому что 0 !== false
    default => 'match: Это что-то другое',
};
// Вывод: match: Это что-то другое

4. Обработка множественных условий и отсутствие break

  • В switch-case каждый case требует break для предотвращения "проваливания" в следующий case.
  • match не имеет "проваливания" — сопоставление завершается при первом совпадении, и break не требуется.
// В match можно объединять условия
$result = match ($code) {
    200, 201 => 'success',
    404 => 'not found',
    500 => 'server error',
    default => 'unknown',
};

// В switch для объединения нужны несколько case без break
switch ($code) {
    case 200:
    case 201:
        $result = 'success';
        break;
    case 404:
        $result = 'not found';
        break;
}

5. Условия сопоставления

  • case в switch поддерживает только простые скалярные значения (числа, строки).
  • match позволяет использовать выражения в условиях сопоставления.
$age = 25;

$category = match (true) {
    $age < 13 => 'child',
    $age < 20 => 'teenager',
    $age < 65 => 'adult',
    default => 'senior',
};

6. Обязательность exhaustive matching

  • switch не требует покрытия всех возможных случаев. Если совпадений нет, просто ничего не выполняется.
  • match требует полного покрытия (exhaustive matching). Если ни одно условие не совпало и нет ветки default, будет выброшено UnhandledMatchError.
$status = 'expired';

// switch может не иметь default
switch ($status) {
    case 'pending':
        handlePending();
        break;
    // Для 'expired' ничего не выполнится — молчаливый пропуск
}

// match без default для неизвестного значения вызовет ошибку
$handler = match ($status) {
    'pending' => handlePending(),
    // UnhandledMatchError для 'expired'
};

Практические рекомендации по выбору

Используйте switch-case:

  • Когда нужно выполнить сложные блоки кода без возврата значения.
  • В проектах на PHP версии ниже 8.0.
  • Когда нужна слабая типизация сравнения (редкий случай).

Используйте match:

  • В PHP 8.0 и выше для возврата значений.
  • Когда важна строгая типизация и безопасность.
  • Для простых сопоставлений с множественными условиями.
  • Когда нужно гарантировать обработку всех возможных случаев.

Вывод

match — это современная, более строгая и выразительная альтернатива switch-case для случаев сопоставления значений с возвратом результата. Он устраняет многие исторические проблемы switch (проваливание, слабая типизация), но не полностью заменяет его, так как switch остается полезным для выполнения сложных процедурных блоков кода. В новых проектах на PHP 8+ match часто является более предпочтительным выбором для операций сопоставления.