Нужно ли явно указывать, что числовые значения являются константами в enum?

Ответ

В PHP 8.1+ при объявлении Backed Enum (перечислений со скалярными значениями) явно указывать ключевое слово const не требуется. Сами case-ы уже являются константными значениями перечисления.

Пример объявления Backed Enum с целочисленными значениями:

enum Status: int {
    case PENDING = 1;   // Это и есть константа. Ключевое слово 'const' не нужно.
    case APPROVED = 2;
    case REJECTED = 3;
}

Особенности и доступ к значениям:

  1. Каждый case — это объект, а его скалярное значение доступно через свойство ->value.
    echo Status::PENDING->value; // Выведет: 1
  2. Значения case-ов должны быть уникальными в рамках перечисления.
  3. Попытка явно объявить константу внутри enum (например, const FOO = 'bar';) возможна, но это будет отдельная сущность, не связанная с case-ами, и обычно является избыточной, что может ухудшить читаемость кода.

Ответ 18+ 🔞

А, слушай, вот реально вопрос, который у новичков часто встаёт, как кол в одном месте. PHP 8.1+ ввёл эти самые Backed Enum'ы, и народ начинает путаться, где тут const ставить, а где — нет.

Так вот, запомни раз и навсегда, ёпта: в Backed Enum'ах явно писать const перед кейсами — это как приехать на вечеринку в смокинге, а там все в шортах. Полный пиздец и не к месту. Не надо этого делать.

Смотри, объявляешь ты перечисление со скалярными значениями — например, с целыми числами. Вот так:

enum Status: int {
    case PENDING = 1;   // Всё! Это уже и есть константа. Никакого 'const' тут не нужно, ядрёна вошь!
    case APPROVED = 2;
    case REJECTED = 3;
}

Каждый case — это уже готовый, зафиксированный объект. Его скалярное значение лежит в свойстве ->value. Хочешь получить цифру? Просто спроси:

echo Status::PENDING->value; // Выдаст тебе 1, и волнение ебать — никакой магии.

Теперь про уникальность. Значения кейсов должны быть разными, иначе PHP тебе такую ошибку впендюрит, что мало не покажется. Нельзя двум разным кейсам присвоить одно и то же число или строку — это же очевидно, блядь.

А вот что многих вгоняет в ступор. Технически-то можно внутрь enum'а запихнуть и обычную константу, типа const FOO = 'bar';. Но зачем, спрашивается? Это будет какая-то левая, отдельная сущность, никак не связанная с твоими кейсами PENDING или APPROVED. Получается каша, мудя полная, читать такой код — терпения ноль ебать. Ты ж не для того enum заводил, чтобы рядом с ним ещё какую-то дичь плодить? Так что просто не делай так. Держи логику чистой.