Médio PHP
Backed enum para níveis de acesso
Enunciado
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.
Requisitos
- Definir backed enum
NivelAcesso: stringcom os três casos e valores exatos. - Implementar método
podeEditar(): boolusandomatch. - Usar
tryFrom('editor')e verificar se não é nulo. - Exibir
namee resultado depodeEditar()no formatoEditor pode editar? Sim.
Código inicial
<?php
// Defina o backed enum NivelAcesso
// Use tryFrom e exiba o resultado
Saída esperada
Editor pode editar? Sim
Ver dica
tryFrom retorna ?NivelAcesso (pode ser null). Verifique com if ($nivel !== null) antes de usar.
Mostrar solução
<?php
// Backed enum com valores string
enum NivelAcesso: string {
case Admin = 'admin';
case Editor = 'editor';
case Leitor = 'leitor';
// Método que verifica permissão de edição
public function podeEditar(): bool {
return match($this) {
self::Admin, self::Editor => true,
self::Leitor => false,
};
}
}
// Converte string para caso usando tryFrom
$nivel = NivelAcesso::tryFrom('editor');
// Verifica se a conversão foi bem-sucedida
if ($nivel !== null) {
$pode = $nivel->podeEditar() ? 'Sim' : 'Não';
echo $nivel->name . ' pode editar? ' . $pode . PHP_EOL;
} else {
echo 'Nível inválido' . PHP_EOL;
}
Passo a passo
- Declaramos o backed enum
NivelAcessocom tipostringe atribuímos valores escalares a cada caso. - O método
podeEditar()usamatch($this)para retornartruepara Admin e Editor, efalsepara Leitor. - Fora do enum, chamamos
NivelAcesso::tryFrom('editor')que tenta converter a string em um caso. - Como
'editor'existe,$nivelrecebe o casoEditor; caso contrário, serianull. - Verificamos se
$nivelnão é nulo e então exibimos o nome e o resultado depodeEditar().
Por que funciona
Backed enums associam um valor escalar a cada caso. O método estático tryFrom percorre os casos e retorna o que tiver o valor correspondente, ou null se não encontrar. Isso permite converter dados externos (como strings de um formulário) em tipos seguros. O método podeEditar() usa match para mapear cada caso a um booleano.
Erros comuns
- Usar
fromem vez detryFrome não tratar a exceção: se o valor não existir,fromlançaValueError. - Esquecer de verificar
nullapóstryFrom: tentar chamarpodeEditar()emnullcausa erro fatal. - Declarar o enum sem o tipo
: string: isso criaria um enum puro e os valores seriam ignorados.
Outra forma de resolver
Poderia usar from dentro de um bloco try/catch:
try {
$nivel = NivelAcesso::from('editor');
// ...
} catch (\ValueError $e) {
echo 'Nível inválido';
}
Mas tryFrom é mais limpo para casos onde o valor pode ser inválido.
Saída esperada
Editor pode editar? Sim