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

«Что такое enum в PHP?» — вопрос из категории PHP Core, который задают на 24% собеседований 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().