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

Junior: питання на співбесіді з теми «Enums»

Питання з реальних співбесід з відповідями: Laravel і PHP, бази даних, JavaScript і фронтенд, Git, Docker, API, безпека й архітектура. Тими самими темами, що й тести.

2 питання

Backed enum - перелік зі скалярним значенням, прив'язаним до кожного кейса:

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

Інтеграція з Laravel:

// каст у моделі - атрибут стає об'єктом enum
protected $casts = ['status' => Status::class];

// валідація
$request->validate(['status' => [Rule::enum(Status::class)]]);

// Route Model Binding теж резолвить enum з URL

Enum робить «магічні рядки» типобезпечними, а методи на enum (label(), color()) зручно інкапсулюють логіку відображення.

Докладніше в документації: Валідація 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 мають бути унікальними й одного типу.

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