Match выражение (PHP 8)

Тренажер по PHP для пользователей с начальным уровнем подготовки.

Тренажер PHP

Тема — выражение match в PHP 8. Это не оператор, а выражение, которое возвращает значение. Оно сопоставляет строго (===), не делает «проваливание» между ветками и не требует break. Несовпадение без ветки default приводит к UnhandledMatchError. В уроке потренируемся собирать синтаксис с =>, группировать варианты через запятую, различать строгие совпадения чисел и строк, использовать match(true) для диапазонов и чинить типичные ошибки: case, двоеточия, пропущенные запятые. В заданиях встретятся форматы replace, error, build_from_parts, predict_result, compare, bank_fill, sequencing и give_result. Начнём с базового каркаса, затем — строгие сравнения, группа вариантов, отсутствие default и исключение, сборка кода из частей и сопоставление свойств match против привычного switch.

Список тем

Базовый каркас match с default

id: 38943_task1

Заполните пропуски в выражении match: установите стрелки => для веток и добавьте метку default для «запасного» варианта. В результате при коде 201 должен выводиться текст Created, при 200 — OK, иначе — Unknown. Следите за запятыми между ветками.

Заполните пропуски
<?php
$code = 201;
echo match ($code) {
  200 input1S 'OK',
  201 input2S 'Created',
  input3S input4S 'Unknown',
};
?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Строгое совпадение: число vs строка

id: 38943_task2

Определите, что выведет код. Помните: match использует строгое сравнение, поэтому 2 и '2' — разные значения. Выберите единственно верный результат.

Выберите правильный вариант ответа
<?php
$val = '2';
$res = match ($val) {
    2 => 'two-int',
    '2' => 'two-str',
    default => 'other',
};
echo $res;
?>
Сообщения
Проверить
Показать подсказку

Исправьте синтаксис веток match

id: 38943_task3

В коде допущены типичные ошибки при записи match: использовано case вместо значения со стрелкой, пропущена запятая между ветками, неоднозначное оформление последней ветки. Исправьте соответствующие строки. При x = 1 должно выводиться ONE.

Найдите ошибку и исправьте
<?php
$x = 1;
$result = match ($x) {
    case 1: 'ONE',
    2 => 'TWO'
    default => 'OTHER'
};
echo $result;
?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Свойства match: сопоставьте описание

id: 38943_task4

Соедините особенности слева с соответствующими пояснениями справа. Учтите строгую проверку типов, отсутствие проваливания между ветками и требование полноты покрытия значений.

Сопоставьте строки в правой части с соответствующими строками в левой по порядковому номеру
Строгое сопоставление значений и типов
Возвращает значение (выражение)
Нет проваливания между ветками
Нужно покрыть все случаи или указать default
Без совпадений и без default будет UnhandledMatchError
Сопоставляет по === без приведения типов
Можно сразу присвоить: $res = match (...) { ... }
break не нужен, выбирается первая подходящая ветка
Сообщения
Проверить
Показать подсказку

Соберите match для статусов HTTP

id: 38943_task5

Из банка токенов соберите выражение match, возвращающее строку по коду статуса: 200 → OK, 201 → Created, 204 → No Content, иначе Unknown. В банке есть лишние токены, которые не относятся к match.

Нужно правильно расставить в пропуски предложенные варианты
<?php
$status = 201;
echo input1S ($status) {
  input2S input3S 'OK',
  input4S input5S 'Created',
  input6S input7S 'No Content',
  input8S input9S 'Unknown',
};
?>
match
switch
case
break;
default
200
201
204
404
=>
=>
=>
=>
:
'OK'
'Created'
'No Content'
'Unknown'
endswitch;
continue;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Соберите match с группой значений

id: 38943_task6

Соберите код, где месяцы с 31 днём перечислены в одной ветке через запятую. Для month = 7 скрипт должен вывести 31. В наборе есть лишние строки (для switch, break и т.п.), не относящиеся к match.

Перетяните в правильном порядке строки из одного блока в другой
<?php
$month = 7;
$days = match ($month) {
    1,3,5,7,8,10,12 => 31,
    4,6,9,11 => 30,
    2 => 28,
    default => 0,
};
echo $days;
?>
case 2:
break;
switch ($month) {
return 31;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Строгость: '0' не равно 0 и не равно false

id: 38943_task7

Определите, какой текст напечатает код. Значение — строка '0'. Учитывайте строгие сравнения типов в match и кандидаты в ветках: число 0, строка '0' и булево false.

Выберите правильный вариант ответа
<?php
$in = '0';
echo match ($in) {
    0 => 'zero-int',
    '0' => 'zero-str',
    false => 'bool-false',
    default => 'other',
};
?>
Сообщения
Проверить
Показать подсказку

Нет default и нет совпадений: что произойдёт?

id: 38943_task8

В коде нет ветки default и значение не совпадает ни с одной веткой. Введите имя исключения/ошибки, которое возникнет при выполнении этого фрагмента. Используйте точное название класса.

Что должно получиться?
<?php
$code = 418;
$msg = match ($code) {
    200 => 'OK',
    404 => 'NOT FOUND',
};
echo $msg;
?>
Сообщения
Проверить
Показать подсказку

Группа значений: замените | на запятую

id: 38943_task9

В ветке match неверно использован символ | для перечисления значений. В PHP допускается перечисление нескольких значений через запятую. Исправьте строку так, чтобы 'A' и 'B' вели к одному результату. Должно выводиться pass.

Найдите ошибку и исправьте
<?php
$grade = 'B';
$out = match ($grade) {
    'A'|'B' => 'pass',
    'C' => 'border',
    default => 'fail',
};
echo $out;
?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

match(true): диапазоны баллов

id: 38943_task10

Восстановите порядок строк для выражения match(true), которое присваивает буквенную оценку по диапазону. При score = 85 ожидается 'B'. Учтите строгие сравнения и порядок условий от большего к меньшему.

Расставьте строки в правильном порядке
<?php
$score = 85;
$label = match (true) {
    $score >= 90 => 'A',
    $score >= 75 => 'B',
    $score >= 60 => 'C',
    default => 'F',
};
echo $label;
?>
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру