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 (
intoustring) definido após: tipo. - Enums podem ter métodos, que podem ser chamados em cada caso.
from()etryFrom()convertem um valor escalar para o caso do enum, lançando exceção ou retornandonull, respectivamente.- Enums implementam a interface
UnitEnum(puro) ouBackedEnum(backed).
<?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;