Примеры

Пример #1 Базовые ограниченные значения

<?php

enum SortOrder
{
case
Asc;
case
Desc;
}

function
query($fields, $filter, SortOrder $order = SortOrder::Asc)
{
/* ... */
}

?>

Функция query() теперь безопасно продолжает работу, поскольку параметр $order гарантирует, что аргумент будет либо вариантом SortOrder::Asc, либо вариантом SortOrder::Desc. Другое значение привело бы к исключению TypeError, поэтому функция обойдётся без проверки ошибок или тестирования.

Пример #2 Расширенные эксклюзивные значения

<?php

enum UserStatus: string
{
case
Pending = 'P';
case
Active = 'A';
case
Suspended = 'S';
case
CanceledByUser = 'C';

public function
label(): string
{
return match (
$this) {
self::Pending => 'В ожидании',
self::Active => 'Активный',
self::Suspended => 'Приостановленный',
self::CanceledByUser => 'Отменён пользователем',
};
}
}

?>

В этом примере статус пользователя ограничивается единственным значением и только из следующих вариантов: UserStatus::Pending, UserStatus::Active, UserStatus::Suspended или UserStatus::CanceledByUser. Определение в сигнатуре функции параметра с типом UserStatus разрешит функции принимать только эти четыре значения, точка.

Каждому из четырёх значений доступен метод label(), который возвращает строку, удобную для чтения человеком. Эта строка не зависит от строки со скалярным эквивалентом «машинного имени», который, например, хранят в поле базы данных или выводят как значение элемента выпадающего списка в HTML-форме.

<?php

foreach (UserStatus::cases() as $case) {
printf(
"<option value=\"%s\">%s</option>\n",
$case->value,
$case->label()
);
}

?>