Варіант enum - це об'єкт, а ключем масиву в PHP може бути лише int чи string. Спроба дає помилку:
$limits = [Plan::Free => 3, Plan::Pro => 100];
// TypeError: Cannot access offset of type Plan on array
Варіанти:
->valuebacked 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. Рівність перевіряють через ===: варіанти - синглтони.
Докладніше в документації: Відмінності перелічень від об'єктів