Что такое enum в PHP?

Ответ

Enum (перечисление) в PHP — это специальный тип данных, введённый в версии 8.1, который позволяет определять фиксированный набор именованных значений (кейсов). Это мощная замена набору констант класса, обеспечивающая строгую типизацию и автодополнение в IDE.

Основные типы enum:

  1. Чистые enum (Pure Enums): Кейсы не имеют скалярного значения.

    enum Status
    {
        case DRAFT;
        case PUBLISHED;
        case ARCHIVED;
    }
    
    function updatePost(Status $status): void { /* ... */ }
    updatePost(Status::PUBLISHED); // Корректно
    updatePost('published'); // Ошибка типа!
  2. Типизированные enum (Backed Enums): Каждому кейсу присваивается скалярное значение (int или string).

    enum HttpStatus: int
    {
        case OK = 200;
        case NOT_FOUND = 404;
        case SERVER_ERROR = 500;
    }
    
    echo HttpStatus::OK->value; // 200
    $status = HttpStatus::from(404); // HttpStatus::NOT_FOUND
    $status = HttpStatus::tryFrom(999); // null (без исключения)

Преимущества перед константами:

  • Типобезопасность: Переменная типа Status может содержать только Status::DRAFT, Status::PUBLISHED или Status::ARCHIVED.
  • Методы и интерфейсы: Enums могут содержать методы и реализовывать интерфейсы.

    enum Status: string
    {
        case DRAFT = 'draft';
        case PUBLISHED = 'published';
    
        public function color(): string
        {
            return match($this) {
                self::DRAFT => 'gray',
                self::PUBLISHED => 'green',
            };
        }
    }
    echo Status::PUBLISHED->color(); // 'green'
  • Итерация: По всем кейсам можно пройтись через Status::cases().

Ответ 18+ 🔞

Слушай, а вот про эти ваши enum в PHP 8.1 — это же просто пиздец как удобно, наконец-то! Раньше-то мы как делали? Объявляли кучу констант в классе и молились, чтобы кто-то случайно не подсунул левую строку. А теперь — красота, типизация на уровне языка, ёпта.

Enum (перечисление) — это, по сути, такой крутой тип, который говорит: «Вот тебе список разрешённых значений, и ни шага в сторону». Замена тем самым константам, но с кучей плюшек. Автодополнение в IDE просто охуенно работает, сразу видно, что можно использовать.

Какие они бывают, эти enum:

  1. Чистые (Pure Enums). Самые простые, без значений. Просто имена. Как будто набор флажков, но круче.

    enum Status
    {
        case DRAFT;
        case PUBLISHED;
        case ARCHIVED;
    }
    
    function updatePost(Status $status): void { /* ... */ }
    updatePost(Status::PUBLISHED); // Всё ок, IDE подсказывает
    updatePost('published'); // А вот тут, блядь, сразу ошибка типа! Никакого доверия ебать ноль к левым строкам.
  2. Типизированные (Backed Enums). Вот эти уже с подвохом — у каждого кейса есть своё значение, int или string. Удобно для работы с базой или API.

    enum HttpStatus: int
    {
        case OK = 200;
        case NOT_FOUND = 404;
        case SERVER_ERROR = 500;
    }
    
    echo HttpStatus::OK->value; // 200 — достал значение
    $status = HttpStatus::from(404); // Получил HttpStatus::NOT_FOUND
    $status = HttpStatus::tryFrom(999); // А тут null вернёт, если нет такого значения, без исключений. Удобно, не надо в try-catch оборачивать.

И главное, чем они овердохуища лучше старых констант:

  • Типобезопасность, ёба! Объявил параметр как Status — и спи спокойно. Туда только Status::DRAFT, Status::PUBLISHED или Status::ARCHIVED. Никакой левой хуйни не проскочит.
  • Методы и интерфейсы можно пихать прямо в enum. Это вообще песня! Раньше для такого приходилось городить отдельные классы-хелперы.

    enum Status: string
    {
        case DRAFT = 'draft';
        case PUBLISHED = 'published';
    
        public function color(): string
        {
            return match($this) {
                self::DRAFT => 'gray',
                self::PUBLISHED => 'green',
            };
        }
    }
    echo Status::PUBLISHED->color(); // 'green' — вызываешь метод прямо у значения. Красота!
  • По всем значениям можно пройтись. Вызвал Status::cases() — и получил массив со всеми кейсами. Итерация, фильтрация — делай что хочешь.

Короче, вещь архиполезная. Как только начал использовать, обратно к константам возвращаться вообще не хочется, честное слово.