Ответ
В PHP 8.1+ при объявлении Backed Enum (перечислений со скалярными значениями) явно указывать ключевое слово const не требуется. Сами case-ы уже являются константными значениями перечисления.
Пример объявления Backed Enum с целочисленными значениями:
enum Status: int {
case PENDING = 1; // Это и есть константа. Ключевое слово 'const' не нужно.
case APPROVED = 2;
case REJECTED = 3;
}
Особенности и доступ к значениям:
- Каждый case — это объект, а его скалярное значение доступно через свойство
->value.echo Status::PENDING->value; // Выведет: 1 - Значения case-ов должны быть уникальными в рамках перечисления.
- Попытка явно объявить константу внутри 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 заводил, чтобы рядом с ним ещё какую-то дичь плодить? Так что просто не делай так. Держи логику чистой.