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

Чим pure enum відрізняється від backed enum і як отримати всі варіанти?

Pure enum - набір іменованих варіантів без значень:

enum Suit
{
    case Hearts;
    case Spades;
}

Backed enum - кожен варіант має скалярне значення (int або string), яке можна зберегти в базу чи передати в JSON:

enum Status: string
{
    case Draft = 'draft';
    case Published = 'published';
}

Status::Published->value;          // 'published'
Status::from('draft');             // Status::Draft
Status::tryFrom('unknown');        // null

Як обрати: якщо значення має покидати PHP (база, API, кеш, черга) - backed. Pure - для внутрішніх станів, що ніде не зберігаються.

Усі варіанти - cases():

Status::cases();                                     // [Status::Draft, Status::Published]
array_column(Status::cases(), 'value');              // ['draft', 'published']
array_map(fn (Status $s) => $s->name, Status::cases()); // ['Draft', 'Published']

Це зручно для випадаючих списків, правил валідації (in:draft,published чи Rule::enum(Status::class) у Laravel), документації API.

Що ще варто знати:

  • name є в будь-якого варіанта, value - лише в backed.
  • Варіанти - синглтони: Status::Draft === Status::Draft, тож порівнюють через ===.
  • Enum не можна створити через new, успадкувати чи додати йому стан (властивості) - лише методи, константи й реалізацію інтерфейсів.
  • Значення backed enum мають бути унікальними й одного типу.

Докладніше в документації: Перелічення: основи

Перевір себе

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

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