Enum em PHP: do switch ao Enum nativo (guia completo)

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que "Enum em PHP" é uma pergunta de um milhão de dólares?

\n\n

Se 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\n

Mas 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\n

Neste 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\n

O problema: como os desenvolvedores PHP viviam antes do PHP 8.1

\n\n

Antes das enumerações nativas, tínhamos dois caminhos principais: constantes de classe e "gambiarras" com classes abstratas. Vamos analisar ambos.

\n\n

Abordagem #1: Constantes de classe (a mais popular)

\n\n
class 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\n

Vantagens: simplicidade, clareza, autocompletar na IDE.

\n

Desvantagens: falta de tipagem. Qualquer um pode passar a string 'invalid_status' — e o PHP não reclama.

\n\n

Abordagem #2: Classe abstrata + construtor privado

\n\n

Desenvolvedores mais experientes iam além:

\n\n
abstract 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\n

Funcionava, mas o código ficava inchado. E ainda era uma emulação, não um suporte real da linguagem.

\n\n

Enums nativos no PHP 8.1: uma revolução

\n\n

Com 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 match e switch
  • \n
\n\n

Sintaxe básica de Enum no PHP

\n\n
enum 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\n

Simples e elegante. Mas isso é só o começo.

\n\n

Tipos de Enum: puros e com valores

\n\n

O PHP suporta dois tipos de enumerações:

\n\n

1. Pure Enum (enumerações puras)

\n

Sem vínculo com valores específicos. Ideal para flags, estados, tipos.

\n\n
enum 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\n

2. Backed Enum (enumerações com valores)

\n

Quando você precisa associar um enum a um valor específico (string ou inteiro).

\n\n
enum 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$                

Blogs

Book Recommendations