Menu
Coddy logo textTech

Resumen - Procesador de pagos

Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 37 de 91.

challenge icon

Desafío

Fácil

Vamos a construir un sistema de procesamiento de pagos completo que reúna todo lo que has aprendido sobre el polimorfismo. Crearás una arquitectura basada en interfaces donde diferentes métodos de pago pueden procesarse a través de un único procesador unificado, demostrando cómo el polimorfismo hace que el código sea flexible y extensible.

Organizarás tu código en cinco archivos:

  • PaymentMethod.php — Define una interfaz PaymentMethod con dos firmas de métodos: process(float $amount): string para manejar el pago, y un método estático getMethodName(): string que devuelva el nombre del tipo de pago. Este contrato asegura que cualquier método de pago pueda ser procesado de manera uniforme.
  • CreditCard.php — Crea una clase CreditCard que implemente PaymentMethod. Incluye el archivo de la interfaz. La clase debe tener una propiedad privada $lastFourDigits establecida a través del constructor. Implementa process() para que devuelva "Processing $[amount] via Credit Card ending in [lastFourDigits]" (formatea el monto a 2 decimales). Implementa el método estático getMethodName() usando late static binding para devolver "Credit Card".
  • PayPal.php — Crea una clase PayPal que implemente PaymentMethod. Incluye el archivo de la interfaz. La clase debe tener una propiedad privada $email establecida a través del constructor. Implementa process() para que devuelva "Processing $[amount] via PayPal account [email]" (formatea el monto a 2 decimales). Implementa el método estático getMethodName() para devolver "PayPal".
  • PaymentProcessor.php — Crea una clase PaymentProcessor que orqueste los pagos. Incluye el archivo de la interfaz. Agrega un método executePayment(PaymentMethod $method, float $amount): string que use type hinting de interfaz para aceptar cualquier método de pago. Este método debe devolver el resultado de llamar a process() en el método de pago. Agrega otro método describeMethod(PaymentMethod $method): string que devuelva "Payment via: [methodName]" usando el método estático getMethodName() de la clase del método de pago pasado.
  • main.php — Incluye todos los archivos de las clases de pago y el procesador. Crea una instancia de PaymentProcessor. Recibirás tres entradas: los últimos cuatro dígitos de una tarjeta de crédito, una dirección de correo electrónico de PayPal y un monto de pago. Crea una instancia de CreditCard y otra de PayPal con sus respectivos identificadores. Convierte el monto a float. Usa el procesador para ejecutar un pago con la tarjeta de crédito primero, luego con PayPal. Imprime cada resultado en su propia línea. Finalmente, imprime la descripción del método para el método de pago PayPal.

La belleza de este diseño es que tu PaymentProcessor no sabe nada sobre tarjetas de crédito o PayPal específicamente; solo conoce la interfaz PaymentMethod. Podrías agregar una clase BankTransfer o Cryptocurrency mañana, y el procesador las manejaría sin ninguna modificación. ¡Ese es el poder del polimorfismo basado en interfaces combinado con el late static binding!

Pruébalo tú mismo

<?php
// Incluir todos los archivos requeridos
require_once 'CreditCard.php';
require_once 'PayPal.php';
require_once 'PaymentProcessor.php';

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

// TODO: Crear una instancia de PaymentProcessor

// TODO: Crear una instancia de CreditCard con los últimos cuatro dígitos

// TODO: Crear una instancia de PayPal con el correo electrónico

// TODO: Ejecutar el pago con tarjeta de crédito e imprimir el resultado

// TODO: Ejecutar el pago con PayPal e imprimir el resultado

// TODO: Imprimir la descripción del método para el método de pago PayPal
?>

Todas las lecciones de Programación Orientada a Objetos