Desafio PHP
Enum com métodos e conversão de e para valor
Enunciado
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).
Requisitos
- Definir backed enum
Moeda: stringcom os três casos e valores exatos. - Implementar
simbolo(): stringecotacaoEmReais(): floatusandomatch. - Criar função
converterParaReaisque multiplica o valor pela cotação. - Usar
Moeda::from('USD')e exibir o resultado formatado com duas casas decimais.
Código inicial
<?php
// Defina o enum Moeda
// Defina a função converterParaReais
// Use from e exiba o resultado
Saída esperada
100 USD = R$ 500.00
Ver dica
Para formatar o número, use number_format($valorConvertido, 2, '.', ''). O símbolo da moeda pode ser obtido com $moeda->simbolo().
Mostrar solução
<?php
// Backed enum representando moedas
enum Moeda: string {
case BRL = 'BRL';
case USD = 'USD';
case EUR = 'EUR';
// Retorna o símbolo da moeda
public function simbolo(): string {
return match($this) {
self::BRL => 'R$',
self::USD => '$',
self::EUR => '€',
};
}
// Retorna a cotação fictícia em reais
public function cotacaoEmReais(): float {
return match($this) {
self::BRL => 1.0,
self::USD => 5.0,
self::EUR => 5.5,
};
}
}
// Função que converte um valor para reais
function converterParaReais(float $valor, Moeda $moeda): float {
return $valor * $moeda->cotacaoEmReais();
}
// Obtém o caso USD a partir da string 'USD'
$moeda = Moeda::from('USD');
$valor = 100.0;
$convertido = converterParaReais($valor, $moeda);
// Exibe o resultado formatado
echo $valor . ' ' . $moeda->name . ' = R$ ' . number_format($convertido, 2, '.', '') . PHP_EOL;
Passo a passo
- Declaramos o backed enum
Moedacom tipostringe os três casos com seus valores. - O método
simbolo()usamatch($this)para retornar o símbolo correspondente a cada moeda. - O método
cotacaoEmReais()também usamatchpara retornar a cotação fictícia. - A função
converterParaReaisrecebe um valor e uma instância deMoeda, e multiplica o valor pela cotação. - No código principal, usamos
Moeda::from('USD')para obter o casoUSDa partir da string. - Chamamos
converterParaReais(100.0, $moeda)e armazenamos o resultado. - Exibimos usando
number_formatpara formatar com duas casas decimais e o símboloR$fixo.
Por que funciona
Backed enums permitem converter strings para casos com from, e cada caso pode ter métodos que fornecem dados específicos. A função converterParaReais aproveita o método cotacaoEmReais() para calcular o valor convertido. A formatação com number_format garante a saída esperada.
Erros comuns
- Esquecer de usar
$thisdentro dos métodos:match($moeda)causaria erro pois$moedanão existe no escopo do método. - Usar
->valueem vez de->namepara exibir o nome da moeda:->valueretorna o valor escalar (ex.: 'USD'), que é igual ao nome neste caso, mas o correto é->namepara o nome do caso. - Não formatar o número:
echo 500.0exibiria500em vez de500.00.
Outra forma de resolver
Poderia adicionar um método formatar(float $valor): string no enum que retorna a string formatada, encapsulando a lógica de formatação. Exemplo:
public function formatar(float $valor): string {
return $this->simbolo() . ' ' . number_format($valor, 2, '.', '');
}
Isso tornaria o código principal mais limpo.
Saída esperada
100 USD = R$ 500.00