Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Middle Enums

Чому enum не можна використати як ключ масиву і що робити замість цього?

Варіант enum - це об'єкт, а ключем масиву в PHP може бути лише int чи string. Спроба дає помилку:

$limits = [Plan::Free => 3, Plan::Pro => 100];
// TypeError: Cannot access offset of type Plan on array

Варіанти:

  • ->value backed enum як ключ:
$limits = [Plan::Free->value => 3, Plan::Pro->value => 100];
$limits[$user->plan->value];

Просто, але втрачається тип: ключ знову рядок, і опечатка в ключі не ловиться.

  • Метод на самому enum - найчастіше найкращий варіант:
enum Plan: string
{
    case Free = 'free';
    case Pro = 'pro';

    public function projectLimit(): int
    {
        return match ($this) {
            self::Free => 3,
            self::Pro => 100,
        };
    }
}

Знання про ліміт живе разом із варіантами, а новий варіант без гілки в match не пройде непомітно.

  • SplObjectStorage чи WeakMap - коли потрібна справжня мапа «об'єкт → значення», наприклад, для підрахунку: $counts[$status] ??= 0 з WeakMap працює з enum як ключами.

Ще про порівняння: < і > між варіантами не мають сенсу - результат завжди false, бо порядку між об'єктами немає. Якщо порядок потрібен, - метод order(): int чи порівняння ->value для числових backed enum. Рівність перевіряють через ===: варіанти - синглтони.

Докладніше в документації: Відмінності перелічень від об'єктів

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання