enum вместо констант
Вопрос
Как вы моделируете статусы заказа: константы класса, строки или enum? Почему?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Backed enum со строковыми значениями для хранения в БД
Типобезопасность: параметр Status не примет произвольную строку
match по enum с полным перебором, анализатор найдёт пропущенный вариант
Методы в enum: label(), canTransitionTo()
from/tryFrom на границе с внешними данными
Каст в ORM: Laravel casts, Doctrine enumType
Что могут спросить следом
- Как хранить enum в базе: строкой или числом?
- Что будет со старыми записями, если удалить вариант?
Разбор
Для статусов беру backed enum со строковыми значениями: enum OrderStatus: string { case New = 'new'; case Paid = 'paid'; }. Строковые значения читаемы в базе и логах и не ломаются при переупорядочивании вариантов, в отличие от чисел.
Главный плюс перед константами типобезопасность: метод changeStatus(OrderStatus $s) не примет опечатку 'payed'. Логику, связанную со статусом, кладу в сам enum: человекочитаемое название, допустимые переходы через match ($this). PHPStan проверяет, что match по enum перебирает все варианты.
На границах (запросы, база) преобразую строку через tryFrom и обрабатываю null как ошибку валидации. ORM делает это сам: в Laravel через casts, в Doctrine через enumType. Удалять вариант, который есть в старых данных, нельзя без миграции данных, иначе from начнёт бросать ValueError.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.