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.
Desafío
FácilVamos 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 interfazPaymentMethodcon dos firmas de métodos:process(float $amount): stringpara manejar el pago, y un método estáticogetMethodName(): stringque 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 claseCreditCardque implementePaymentMethod. Incluye el archivo de la interfaz. La clase debe tener una propiedad privada$lastFourDigitsestablecida a través del constructor. Implementaprocess()para que devuelva"Processing $[amount] via Credit Card ending in [lastFourDigits]"(formatea el monto a 2 decimales). Implementa el método estáticogetMethodName()usando late static binding para devolver"Credit Card".PayPal.php— Crea una clasePayPalque implementePaymentMethod. Incluye el archivo de la interfaz. La clase debe tener una propiedad privada$emailestablecida a través del constructor. Implementaprocess()para que devuelva"Processing $[amount] via PayPal account [email]"(formatea el monto a 2 decimales). Implementa el método estáticogetMethodName()para devolver"PayPal".PaymentProcessor.php— Crea una clasePaymentProcessorque orqueste los pagos. Incluye el archivo de la interfaz. Agrega un métodoexecutePayment(PaymentMethod $method, float $amount): stringque use type hinting de interfaz para aceptar cualquier método de pago. Este método debe devolver el resultado de llamar aprocess()en el método de pago. Agrega otro métododescribeMethod(PaymentMethod $method): stringque devuelva"Payment via: [methodName]"usando el método estáticogetMethodName()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 dePaymentProcessor. 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 deCreditCardy otra dePayPalcon 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
1Fundamentos de OOP
Archivos externosIntroducción a OOPClases vs ObjetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Resumen - Calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasResumen - Jerarquía de empleados7Encapsulamiento
Público, Protegido, PrivadoModificadores de acceso a fondoGetters y SettersOcultamiento de informaciónPromoción de constructor (8.0)Resumen - Sistema de registros de estudiantes10Conceptos avanzados de POO
Composición vs. HerenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibers (PHP 8.1)Clonación de objetos a fondoGeneradores e Iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Espacios de nombres y Autoloading
Introducción a los espacios de nombresLa palabra clave useEstándar de Autoloading PSR-4Autoloader de ComposerResumen - Proyecto organizado5Interfaces y Contratos
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesInterfaz vs Clase AbstractaType Hinting con InterfacesResumen - Calculadora de Formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeResumen - Colección personalizada3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Resumen - Gestor de cuenta bancaria6Polimorfismo
Sobrescritura de métodos revisadaPolimorfismo mediante interfacesType Hinting y tipos de uniónEnlace estático tardíoResumen - Procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos de TraitsMétodos abstractos en TraitsTraits frente a herencia12Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy