Ответ
Enum (перечисление) в PHP — это специальный тип данных, введённый в версии 8.1, который позволяет определять фиксированный набор именованных значений (кейсов). Это мощная замена набору констант класса, обеспечивающая строгую типизацию и автодополнение в IDE.
Основные типы enum:
-
Чистые enum (Pure Enums): Кейсы не имеют скалярного значения.
enum Status { case DRAFT; case PUBLISHED; case ARCHIVED; } function updatePost(Status $status): void { /* ... */ } updatePost(Status::PUBLISHED); // Корректно updatePost('published'); // Ошибка типа! -
Типизированные 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:
-
Чистые (Pure Enums). Самые простые, без значений. Просто имена. Как будто набор флажков, но круче.
enum Status { case DRAFT; case PUBLISHED; case ARCHIVED; } function updatePost(Status $status): void { /* ... */ } updatePost(Status::PUBLISHED); // Всё ок, IDE подсказывает updatePost('published'); // А вот тут, блядь, сразу ошибка типа! Никакого доверия ебать ноль к левым строкам. -
Типизированные (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()— и получил массив со всеми кейсами. Итерация, фильтрация — делай что хочешь.
Короче, вещь архиполезная. Как только начал использовать, обратно к константам возвращаться вообще не хочется, честное слово.