Menu
Coddy logo textTech

Recapitulação - Processador de Pagamentos

Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy — lição 37 de 91.

challenge icon

Desafio

Fácil

Vamos construir um sistema completo de processamento de pagamentos que reúne tudo o que você aprendeu sobre polimorfismo. Você criará uma arquitetura baseada em interface onde diferentes métodos de pagamento podem ser processados por meio de um único processador unificado — demonstrando como o polimorfismo torna o código flexível e extensível.

Você organizará seu código em cinco arquivos:

  • PaymentMethod.php — Defina uma interface PaymentMethod com duas assinaturas de método: process(float $amount): string para lidar com o pagamento, e um método estático getMethodName(): string que retorna o nome do tipo de pagamento. Este contrato garante que qualquer método de pagamento possa ser processado uniformemente.
  • CreditCard.php — Crie uma classe CreditCard que implementa PaymentMethod. Inclua o arquivo da interface. A classe deve ter uma propriedade privada $lastFourDigits definida através do construtor. Implemente process() para retornar "Processing $[amount] via Credit Card ending in [lastFourDigits]" (formate o valor para 2 casas decimais). Implemente o getMethodName() estático usando late static binding para retornar "Credit Card".
  • PayPal.php — Crie uma classe PayPal que implementa PaymentMethod. Inclua o arquivo da interface. A classe deve ter uma propriedade privada $email definida através do construtor. Implemente process() para retornar "Processing $[amount] via PayPal account [email]" (formate o valor para 2 casas decimais). Implemente o getMethodName() estático para retornar "PayPal".
  • PaymentProcessor.php — Crie uma classe PaymentProcessor que orquestra os pagamentos. Inclua o arquivo da interface. Adicione um método executePayment(PaymentMethod $method, float $amount): string que usa type hinting de interface para aceitar qualquer método de pagamento. Este método deve retornar o resultado da chamada de process() no método de pagamento. Adicione outro método describeMethod(PaymentMethod $method): string que retorna "Payment via: [methodName]" usando o getMethodName() estático da classe do método de pagamento passado.
  • main.php — Inclua todos os arquivos de classe de pagamento e o processador. Crie uma instância de PaymentProcessor. Você receberá três entradas: os últimos quatro dígitos de um cartão de crédito, um endereço de e-mail do PayPal e um valor de pagamento. Crie uma instância de CreditCard e uma de PayPal com seus respectivos identificadores. Converta o valor para float. Use o processador para executar um pagamento com o cartão de crédito primeiro, depois com o PayPal. Imprima cada resultado em sua própria linha. Por fim, imprima a descrição do método para o método de pagamento PayPal.

A beleza deste design é que seu PaymentProcessor não sabe nada sobre cartões de crédito ou PayPal especificamente — ele só conhece a interface PaymentMethod. Você poderia adicionar uma classe BankTransfer ou Cryptocurrency amanhã, e o processador as manipularia sem modificações. Esse é o poder do polimorfismo baseado em interface combinado com late static binding!

Experimente você mesmo

<?php
// Incluir todos os arquivos necessários
require_once 'CreditCard.php';
require_once 'PayPal.php';
require_once 'PaymentProcessor.php';

// Ler as entradas
$lastFourDigits = trim(fgets(STDIN));
$paypalEmail = trim(fgets(STDIN));
$amount = floatval(trim(fgets(STDIN)));

// TODO: Criar uma instância de PaymentProcessor

// TODO: Criar uma instância de CreditCard com os últimos quatro dígitos

// TODO: Criar uma instância de PayPal com o e-mail

// TODO: Executar o pagamento com cartão de crédito e imprimir o resultado

// TODO: Executar o pagamento com PayPal e imprimir o resultado

// TODO: Imprimir a descrição do método para o método de pagamento PayPal
?>

Todas as lições de Programação Orientada a Objetos