Ответ вслух Middle PHP 8.x: enum, readonly, match обновлено

enum вместо констант

Вопрос

Как вы моделируете статусы заказа: константы класса, строки или enum? Почему?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Для статусов беру backed enum со строковыми значениями: enum OrderStatus: string { case New = 'new'; case Paid = 'paid'; }. Строковые значения читаемы в базе и логах и не ломаются при переупорядочивании вариантов, в отличие от чисел.

Что должно прозвучать в ответе

  • 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 ошибок.

Термины по теме