Da trilha de PHP Este conceito ainda não saiu como card do dia. ir para o card de hoje

PHP Tipos Intermediário

Enums

Enums (enumerações) foram introduzidos no PHP 8.1 e permitem definir um conjunto fixo de valores possíveis para um tipo. Eles são úteis para representar conceitos como status, níveis de acesso, dias da semana, etc., garantindo type safety e evitando erros com strings ou números mágicos.

Existem dois tipos de enums: enum puro (sem valor associado) e backed enum (com valor escalar, como int ou string). Enums puros são usados quando só precisamos dos casos como identificadores únicos, enquanto backed enums permitem converter facilmente entre o caso e um valor primitivo.

Além disso, enums podem ter métodos, constantes e implementar interfaces, o que os torna muito poderosos. Para backed enums, temos os métodos estáticos from() e tryFrom() que convertem um valor escalar de volta para o caso correspondente. from() lança uma exceção se o valor não existir, enquanto tryFrom() retorna null nesse caso.

Pontos-chave

  • Enums puros não têm valor associado; cada caso é um objeto único.
  • Backed enums possuem um valor escalar (int ou string) definido após : tipo.
  • Enums podem ter métodos, que podem ser chamados em cada caso.
  • from() e tryFrom() convertem um valor escalar para o caso do enum, lançando exceção ou retornando null, respectivamente.
  • Enums implementam a interface UnitEnum (puro) ou BackedEnum (backed).
enums.php
<?php

// Enum puro: representa os dias da semana
enum DiaSemana {
    case Segunda;
    case Terca;
    case Quarta;
    case Quinta;
    case Sexta;
    case Sabado;
    case Domingo;

    // Método que retorna se é dia útil
    public function ehDiaUtil(): bool {
        return match($this) {
            self::Sabado, self::Domingo => false,
            default => true,
        };
    }
}

// Backed enum: representa níveis de acesso com valores string
enum NivelAcesso: string {
    case Admin = 'admin';
    case Editor = 'editor';
    case Leitor = 'leitor';

    // Método que retorna uma descrição
    public function descricao(): string {
        return match($this) {
            self::Admin => 'Acesso total',
            self::Editor => 'Pode editar conteúdo',
            self::Leitor => 'Apenas leitura',
        };
    }
}

// Exemplos de uso
$hoje = DiaSemana::Quarta;
echo $hoje->name . ' é dia útil? ' . ($hoje->ehDiaUtil() ? 'Sim' : 'Não') . PHP_EOL;

$acesso = NivelAcesso::from('editor');
echo $acesso->name . ': ' . $acesso->descricao() . PHP_EOL;

$invalido = NivelAcesso::tryFrom('invalido');
echo 'Tentativa inválida: ' . var_export($invalido, true) . PHP_EOL;

Exercícios

  1. 1
    Fácil

    Enum puro para status de pedido

    Crie um enum puro chamado StatusPedido com os casos Pendente, Pago, Enviado e Entregue. Adicione um método mensagem() que retorna uma string descrevendo o status. Depois, instancie um caso e exiba sua mensagem.

    Resolver
  2. 2
    Médio

    Backed enum para níveis de acesso

    Crie um backed enum chamado NivelAcesso com valores string: Admin = 'admin', Editor = 'editor', Leitor = 'leitor'. Adicione um método podeEditar(): bool que retorna true para Admin e Editor, e false para Leitor. Use tryFrom para converter a string 'editor' em um caso e exiba o nome e se pode editar.

    Resolver
  3. 3
    Desafio

    Enum com métodos e conversão de e para valor

    Crie um backed enum Moeda: string com os casos BRL = 'BRL', USD = 'USD', EUR = 'EUR'. Adicione um método simbolo(): string que retorna 'R$', '$' ou '€' respectivamente. Adicione também um método cotacaoEmReais(): float que retorna a cotação fictícia: BRL = 1.0, USD = 5.0, EUR = 5.5. Depois, crie uma função converterParaReais(float $valor, Moeda $moeda): float que converte um valor na moeda dada para reais. No código principal, use Moeda::from('USD') para obter o caso, converta 100 USD para reais e exiba no formato 100 USD = R$ 500.00 (use number_format).

    Resolver

Continue estudando