
Пользуетесь константами класса? Пора узнать о четырех веских причинах перехода на перечисления, которые появились в PHP два года назад.
1) Встроенный метод «cases»
Раньше в проекте с разными статусами пользователей — одни из которых активные, другие забаненные, а у третьих не завершена регистрация — эти состояния обрабатывались константами класса, что приводило к такому коду:

Почему здесь метод all
? Потому что выпадающий список со всевозможными опциями очень востребован. Для него либо создают такой метод, либо прибегают к использованию отражения.
Но посмотрите, как это упрощается перечислениями:

С ними применяется встроенный метод cases
, в котором автоматически возвращается массив всех доступных опций. Теперь, когда добавляется новый статус, не нужно обновлять список общих параметров вручную.

2) Подсказки типа
Рассмотрим метод для задания статуса пользователя. Сохраняем в базе данных только допустимые статусы:

Выглядит немного уродливо. Но теперь имеется решение получше:

Благодаря подсказке типа, аргумент метода ожидает опцию из перечисления UserStatus
, и мы избавляемся здесь от возможности бага. Проблемы, вызванные недопустимыми значениями статуса, теперь исключены.
3) Методы перечисления
Что, если пользователям с одним статусом разрешено входить в систему, а с другим — нет?
Раньше логика выглядела так:

Теперь же, с перечислением, так:

Разница не большая, но код чище и короче.
4) Уникальность
Хотя этот пункт немного дублирует второй, выделим его отдельно.
К статусам пользователей добавим статусы товаров интернет-магазина:

Возьмем код из примера выше и неправильно его используем:

Ошибки не возникнет. Казалось бы, не такая уж большая проблема, но если мы в будущем изменим значение константы ProductStatus::ACTIVE
, то непременно получим здесь ошибку.
А с перечислениями? Перечисления уникальны.

Даже если у UserStatus::ACTIVE
и ProductStatus::ACTIVE
одинаковое значение, они различаются. Это легко проверить вручную:

Подсказка типа здесь приходится кстати дважды, не позволяя использовать неправильные: значения; источники этих значений, даже если они выглядят подходящими.
Читайте также:
- PHP: поймай меня, если сможешь
- Продвинутые техники PHP. Часть 2
- Раскройте возможности генераторов PHP
Читайте нас в Telegram, VK и Дзен
Перевод статьи Vlad Reshetilo: 4 Reasons to use PHP Enums instead of old-fashioned class constants