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: string com os três casos e valores exatos.
  • Implementar simbolo(): string e cotacaoEmReais(): float usando match.
  • Criar função converterParaReais que 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

  1. Declaramos o backed enum Moeda com tipo string e os três casos com seus valores.
  2. O método simbolo() usa match($this) para retornar o símbolo correspondente a cada moeda.
  3. O método cotacaoEmReais() também usa match para retornar a cotação fictícia.
  4. A função converterParaReais recebe um valor e uma instância de Moeda, e multiplica o valor pela cotação.
  5. No código principal, usamos Moeda::from('USD') para obter o caso USD a partir da string.
  6. Chamamos converterParaReais(100.0, $moeda) e armazenamos o resultado.
  7. Exibimos usando number_format para formatar com duas casas decimais e o símbolo R$ 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 $this dentro dos métodos: match($moeda) causaria erro pois $moeda não existe no escopo do método.
  • Usar ->value em vez de ->name para exibir o nome da moeda: ->value retorna o valor escalar (ex.: 'USD'), que é igual ao nome neste caso, mas o correto é ->name para o nome do caso.
  • Não formatar o número: echo 500.0 exibiria 500 em vez de 500.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