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()) зручно інкапсулюють логіку відображення.
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 мають бути унікальними й одного типу.