Пример #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()
);
}
?>