Por que "Enum em PHP" é uma pergunta de um milhão de dólares?
\n\nSe você já pesquisou "enum em PHP" no Google, sabe: antes do PHP 8.1, esse tópico era uma verdadeira aventura. Desenvolvedores reinventavam a roda com constantes, classes abstratas e traits engenhosos. O Stack Overflow estava cheio de perguntas como "Como emular Enum no PHP?", e as respostas acumulavam centenas de votos positivos.
\n\nMas os tempos mudaram. A partir do PHP 8.1, as enumerações (Enum) se tornaram parte nativa da linguagem. E isso não é apenas açúcar sintático — é uma ferramenta poderosa para escrever código limpo, seguro e autodocumentado.
\n\nNeste artigo, vamos abordar tudo: desde a abordagem clássica com constantes até os Enums modernos, com exemplos reais e melhores práticas. Vamos nessa!
\n\nO problema: como os desenvolvedores PHP viviam antes do PHP 8.1
\n\nAntes das enumerações nativas, tínhamos dois caminhos principais: constantes de classe e "gambiarras" com classes abstratas. Vamos analisar ambos.
\n\nAbordagem #1: Constantes de classe (a mais popular)
\n\nclass OrderStatus {\n const PENDING = 'pending';\n const PROCESSING = 'processing';\n const SHIPPED = 'shipped';\n const DELIVERED = 'delivered';\n const CANCELLED = 'cancelled';\n}\n\n// Uso\n$status = OrderStatus::PENDING;\nif ($status === OrderStatus::PROCESSING) {\n echo 'Pedido em processamento';\n}\n\nVantagens: simplicidade, clareza, autocompletar na IDE.
\nDesvantagens: falta de tipagem. Qualquer um pode passar a string 'invalid_status' — e o PHP não reclama.
\n\nAbordagem #2: Classe abstrata + construtor privado
\n\nDesenvolvedores mais experientes iam além:
\n\nabstract class OrderStatus {\n private function __construct() {}\n \n public static function pending(): self {\n return new class extends OrderStatus {};\n }\n public static function processing(): self {\n return new class extends OrderStatus {};\n }\n // ... demais status\n}\n\nFuncionava, mas o código ficava inchado. E ainda era uma emulação, não um suporte real da linguagem.
\n\nEnums nativos no PHP 8.1: uma revolução
\n\nCom o lançamento do PHP 8.1, o problema de "enum em PHP" foi resolvido de uma vez por todas. Agora, as enumerações são tipos completos que:
\n\n- \n
- Suportam tipagem estrita \n
- Possuem métodos embutidos (
name,value,cases()) \n - Podem implementar interfaces \n
- Suportam traits \n
- Integram-se com
matcheswitch\n
Sintaxe básica de Enum no PHP
\n\nenum OrderStatus {\n case Pending;\n case Processing;\n case Shipped;\n case Delivered;\n case Cancelled;\n}\n\n// Uso\n$status = OrderStatus::Pending;\necho $status->name; // 'Pending'\n\nSimples e elegante. Mas isso é só o começo.
\n\nTipos de Enum: puros e com valores
\n\nO PHP suporta dois tipos de enumerações:
\n\n1. Pure Enum (enumerações puras)
\nSem vínculo com valores específicos. Ideal para flags, estados, tipos.
\n\nenum UserRole {\n case Admin;\n case Editor;\n case Viewer;\n}\n\nfunction checkAccess(UserRole $role): bool {\n return match($role) {\n UserRole::Admin => true,\n UserRole::Editor => true,\n UserRole::Viewer => false,\n };\n}\n\n2. Backed Enum (enumerações com valores)
\nQuando você precisa associar um enum a um valor específico (string ou inteiro).
\n\nenum OrderStatus: string {\n case Pending = 'pending';\n case Processing = 'processing';\n case Shipped = 'shipped';\n case Delivered = 'delivered';\n case Cancelled = 'cancelled';\n}\n\n// Obtendo o valor\n$status = OrderStatus::Shipped;\necho $status->value; // 'shipped'\n\n// Criando a partir de um valor\n$