← Назад к вопросам

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

1.2 Junior🔥 131 комментариев
#PHP Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ответ на вопрос о явном указании числовых значений в enum

В PHP 8.1+ при работе с enum явное указание числовых значений зависит от типа enum и конкретных требований вашего кода. Давайте разберем это подробнее.

Типы enum в PHP

PHP поддерживает два основных типа enum:

1. Pure Enum (Чистые перечисления)

Для чистых enum не нужно и даже нельзя явно указывать числовые значения. Они являются объектами и не имеют скалярного представления по умолчанию.

enum Status
{
    case DRAFT;
    case PUBLISHED;
    case ARCHIVED;
}

// Эти case - объекты, а не числа

2. Backed Enum (Типизированные перечисления)

Для backed enum, которые имеют скалярное представление (string или int), вы можете и должны явно указывать значения, если хотите использовать их в качестве скаляров.

enum Status: int
{
    case DRAFT = 1;
    case PUBLISHED = 2;
    case ARCHIVED = 3;
}

Когда нужно явно указывать числовые значения?

Обязательно указывайте значения в следующих случаях:

  1. Когда enum имеет тип (int или string) в объявлении
  2. Когда вам нужно сериализовать enum в базу данных, JSON, API
  3. Когда необходима обратная совместимость с существующими числовыми константами
  4. При интеграции с внешними системами, которые ожидают числовые значения

Практические примеры

Пример без явных значений (не скомпилируется):

enum Status: int
{
    case DRAFT;      // ОШИБКА: должен быть значением int
    case PUBLISHED;  // ОШИБКА: должен быть значением int
}

Корректный пример с явными значениями:

enum HttpStatus: int
{
    case OK = 200;
    case NOT_FOUND = 404;
    case SERVER_ERROR = 500;
}

// Использование
$status = HttpStatus::OK;
echo $status->value; // 200

Важные особенности

  1. Уникальность значений: Все значения должны быть уникальными в рамках enum
  2. Типизация: Если указан тип, все case должны иметь значения этого типа
  3. Readonly свойства: Значения enum доступны только для чтения через свойство ->value

Лучшие практики

  • Всегда указывайте тип, если нужны скалярные значения
  • Используйте понятные имена, а не только числовые значения
  • Документируйте значения, особенно если они используются в публичных API
  • Избегайте "магических чисел" - используйте enum для их замены
// Хороший пример с документацией
enum Permission: int
{
    /** Право на чтение */
    case READ = 1;
    
    /** Право на запись */
    case WRITE = 2;
    
    /** Право на удаление */
    case DELETE = 4;
    
    /** Полные права администратора */
    case ADMIN = 255;
}

Вывод

Явно указывать числовые значения нужно только для backed enum с типом int, и это обязательно. Для pure enum числовые значения не поддерживаются на уровне языка. Выбор между pure и backed enum зависит от того, нужно ли вам скалярное представление для хранения в БД, передачи через API или интеграции с legacy-системами. В современном PHP разработке enum предоставляют типобезопасную альтернативу классическим константам и делают код более читаемым и поддерживаемым.