Fácil PHP
Enum puro para status de pedido
Enunciado
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.
Requisitos
- Definir enum puro
StatusPedidocom os quatro casos exatos. - Implementar método
mensagem(): stringque retorna uma descrição para cada caso. - Criar uma variável com um caso e imprimir
nameemensagem().
Código inicial
<?php
// Defina o enum StatusPedido aqui
// Crie uma instância e exiba a mensagem
Saída esperada
Pendente: Aguardando pagamento
Ver dica
Use match($this) dentro do método para retornar a mensagem correta para cada caso.
Mostrar solução
<?php
// Enum puro representando o status de um pedido
enum StatusPedido {
case Pendente;
case Pago;
case Enviado;
case Entregue;
// Método que retorna uma mensagem descritiva
public function mensagem(): string {
return match($this) {
self::Pendente => 'Aguardando pagamento',
self::Pago => 'Pagamento confirmado',
self::Enviado => 'Pedido enviado',
self::Entregue => 'Pedido entregue',
};
}
}
// Cria um caso e exibe a mensagem
$status = StatusPedido::Pendente;
echo $status->name . ': ' . $status->mensagem() . PHP_EOL;
Passo a passo
- Declaramos o enum puro
StatusPedidocom a palavra-chaveenume listamos os casos. - Dentro do enum, definimos o método
mensagem()que usamatch($this)para comparar o caso atual. - Cada braço do
matchretorna a string correspondente ao status. - Fora do enum, criamos a variável
$statuscom o casoPendente. - Imprimimos o nome do caso (
$status->name) e a mensagem ($status->mensagem()).
Por que funciona
Enums puros são objetos únicos e cada caso é uma instância da classe enum. O método mensagem() pode acessar $this (o caso atual) e usar match para retornar o valor adequado. A propriedade name está disponível em qualquer enum e retorna o nome do caso como string.
Erros comuns
- Esquecer de usar
$thisnomatch:match($status)causaria erro pois$statusnão está definido dentro do método. - Não cobrir todos os casos no
match: o PHP lançará\UnhandledMatchErrorse um caso não for tratado. - Usar
->valueem enum puro: enums puros não têm propriedadevalue; isso gera erro.
Outra forma de resolver
Poderia usar switch em vez de match, mas match é mais conciso e seguro. Exemplo:
switch ($this) {
case self::Pendente: return 'Aguardando pagamento';
// ...
}
Saída esperada
Pendente: Aguardando pagamento