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

Что такое enum?

2.3 Middle🔥 171 комментариев
#PHP Core

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

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

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

Что такое Enum (Перечисление)?

Enum (перечисление) — это особый тип данных, который позволяет определить набор именованных констант, делая код более читаемым, типобезопасным и поддерживаемым. В PHP перечисления появились в версии 8.1 (2021 год) и стали важной частью современной разработки на языке.

Основные цели и преимущества enum

  • Типобезопасность: Замена "магических строк" или чисел, которые легко ошибиться (например, 'active' вместо 'активный').
  • Читаемость: Именованные значения (Status::Active) понятнее, чем их примитивные аналоги (1).
  • Автодополнение: IDE могут подсказывать доступные варианты.
  • Предсказуемость: Ограничение допустимых значений для аргумента функции или свойства класса.
  • Снижение количества ошибок: Невозможно случайно присвоить недопустимое значение.

Типы enum в PHP

PHP поддерживает два основных типа перечислений.

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

Самый простой вид. Кейсы не имеют связанных значений, они являются синглтон-объектами. Используются, когда важна лишь идентификация варианта.

<?php
enum Status: string
{
    case Pending = 'pending';
    case Active = 'active';
    case Suspended = 'suspended';
    case Deleted = 'deleted';
}

class User
{
    public function setStatus(Status $status): void
    {
        $this->status = $status;
        // Можно безопасно сравнивать
        if ($status === Status::Active) {
            $this->activate();
        }
    }
}

$user->setStatus(Status::Active);
// $user->setStatus('active'); // Ошибка типа!

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

Имеют скалярный "закулисный" тип (string или int). Позволяют конвертировать между значением кейса и его объектным представлением.

<?php
enum HttpStatus: int
{
    case OK = 200;
    case Created = 201;
    case BadRequest = 400;
    case NotFound = 404;
    case ServerError = 500;
}

// Получение скалярного значения
$code = HttpStatus::NotFound->value; // 404

// Восстановление enum из скалярного значения
$status = HttpStatus::from(404); // Возвращает HttpStatus::NotFound
$status = HttpStatus::tryFrom(999); // Возвращает null, если не найдено (без исключения)

echo $status->name; // 'NotFound'

Расширенные возможности enum в PHP

Перечисления в PHP — это не просто списки констант, а полноценные классы. Это открывает мощные возможности:

  • Методы: Enum может содержать собственные методы.
  • Интерфейсы: Enum может реализовывать интерфейсы.
  • Trait'ы: В enum можно использовать трейты.
  • Статические методы: Для фабричной логики.
  • Константы: Могут быть собственные константы класса.
<?php
enum Status: string
{
    case Pending = 'pending';
    case Active = 'active';

    // Метод экземпляра
    public function getColor(): string
    {
        return match($this) {
            self::Pending => 'gray',
            self::Active => 'green',
        };
    }

    // Статический метод
    public static function getActiveCases(): array
    {
        return [
            self::Active,
        ];
    }
}

$currentStatus = Status::Active;
echo $currentStatus->getColor(); // 'green'
print_r(Status::getActiveCases()); // [Status::Active]

Сравнение с альтернативами до PHP 8.1

До введения enum часто использовались:

  1. Массивы констант в классе: Не обеспечивали типобезопасности, были просто набором значений.
    class StatusClass {
        const PENDING = 1;
        const ACTIVE = 2;
    }
    
  2. "Магические" строки/числа: Приводили к ошибкам и сложностям в рефакторинге.
    $user->setStatus('активен'); // Ошибка: опечатка
    

Enum решили эти проблемы, предоставив настоящий тип с валидацией на уровне языка.

Практические примеры использования

  • Статусы объектов: Заказ (Pending, Paid, Shipped).
  • Типы объектов: Тип уведомления (Email, SMS, Push).
  • Роли пользователей: (Guest, User, Moderator, Admin).
  • Коды ответов API: Как в примере с HttpStatus.
  • Настройки/флаги: Особенно с использованием битовых масок (через атрибуты или методы).

Важные ограничения

  • Нельзя наследовать enum или наследоваться от него.
  • Нельзя явно создавать экземпляры enum (через new).
  • Клонирование enum запрещено.
  • Backed enum может быть только типа int или string.

В заключение, enum в PHP — это мощный инструмент для моделирования фиксированного набора значений, который значительно повышает надежность, читаемость и поддерживаемость кода, особенно в архитектуре современных приложений. Их внедрение следует принципам чистого кода и DDD (Domain-Driven Design), где доменные термины становятся полноценными типами в системе.

Что такое enum? | PrepBro