Выражение matchпереходит к оценке на основе проверки подлинности значения. Подобно switchоператору, matchвыражение имеет подлежащее выражение, которое сравнивается с несколькими альтернативами. В отличие от switch, он будет оцениваться как значение, очень похожее на троичные выражения. В отличие от switch, сравнение является проверкой идентичности ( ===), а не слабой проверкой равенства ( ==). Выражения соответствия доступны начиная с PHP 8.0.0.

Пример #1 Структура matchвыражения

<?php
$return_value = match (subject_expression) {
    single_conditional_expression => return_expression,
    conditional_expression1, conditional_expression2 => return_expression,
};
?>

Пример #2 Базовое matchиспользование

<?php
$food = 'cake';

$return_value = match ($food) {
    'apple' => 'This food is an apple',
    'bar' => 'This food is a bar',
    'cake' => 'This food is a cake',
};

var_dump($return_value);
?>

Приведенный выше пример выведет:

string(19) "Эта еда - торт"

Примечание . Необязательно использовать результат matchвыражения.

Примечание . Выражение должно заканчиваться точкой с запятой . match;

Выражение matchпохоже на switchоператор, но имеет некоторые ключевые отличия:

  • Рука matchсравнивает значения строго ( ===), а не произвольно, как это делает оператор switch.
  • Выражение matchвозвращает значение.
  • matchоружие не проваливается в более поздние случаи, как switchэто делают утверждения.
  • Выражение matchдолжно быть исчерпывающим.

Как switchоператоры, match выражения выполняются последовательное соответствие друг другу. В начале код не выполняется. Условные выражения оцениваются только в том случае, если все предыдущие условные выражения не соответствуют выражению субъекта. Будет оцениваться только возвращаемое выражение, соответствующее соответствующему условному выражению. Например:

<?php
$result = match ($x) {
    foo() => ...,
    $this->bar() => ..., // $this->bar() isn't called if foo() === $x
    $this->baz => beep(), // beep() isn't called unless $x === $this->baz
    // etc.
};
?>

matchплечи выражений могут содержать несколько выражений, разделенных запятой. Это логическое ИЛИ, и это сокращение для нескольких спичечных плеч с одной и той же правой стороной.

<?php
$result = match ($x) {
    // This match arm:
    $a, $b, $c => 5,
    // Is equivalent to these three match arms:
    $a => 5,
    $b => 5,
    $c => 5,
};
?>

Особый случай — defaultузор. Этот шаблон соответствует всему, что ранее не соответствовало. Например:

<?php
$expressionResult = match ($condition) {
    1, 2 => foo(),
    3, 4 => bar(),
    default => baz(),
};
?>

Примечание . Использование нескольких шаблонов по умолчанию вызовет E_FATAL_ERRORошибку.

Выражение matchдолжно быть исчерпывающим. Если подлежащее выражение не обрабатывается ни одной из ветвей совпадения, выдается ошибка UnhandledMatchError .

Example #3 Пример необработанного выражения совпадения

<?php
$condition = 5;

try {
    match ($condition) {
        1, 2 => foo(),
        3, 4 => bar(),
    };
} catch (\UnhandledMatchError $e) {
    var_dump($e);
}
?>

Приведенный выше пример выведет:

объект(UnhandledMatchError)#1 (7) {
  ["сообщение":защищено]=>
  string(33) "Необработанное значение совпадения типа int"
  ["строка":"Ошибка":личное]=>
  строка(0) ""
  ["код":защищено]=>
  интервал (0)
  ["файл":защищено]=>
  string(9) "/in/ICgGK"
  ["строка":защищено]=>
  интервал(6)
  ["след":"Ошибка":частный]=>
  массив (0) {
  }
  ["предыдущий":"Ошибка":личное]=>
  НУЛЕВОЙ
}

Использование выражений совпадения для обработки проверок без идентификации

Можно использовать matchвыражение для обработки условных случаев, не являющихся идентификаторами, используя trueв качестве выражения субъекта.

Пример #4 Использование выражений обобщенного соответствия для ветвления по целочисленным диапазонам

<?php

$age = 23;

$result = match (true) {
    $age >= 65 => 'senior',
    $age >= 25 => 'adult',
    $age >= 18 => 'young adult',
    default => 'kid',
};

var_dump($result);
?>

Приведенный выше пример выведет:

string(11) "молодой взрослый"

Пример #5 Использование обобщенных выражений соответствия для ветвления по строковому содержимому

<?php

$text = 'Bienvenue chez nous';

$result = match (true) {
    str_contains($text, 'Welcome') || str_contains($text, 'Hello') => 'en',
    str_contains($text, 'Bienvenue') || str_contains($text, 'Bonjour') => 'fr',
    // ...
};

var_dump($result);
?>

Приведенный выше пример выведет:

строка(2) "фр"