Récapitulatif - Processeur de paiement
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy — leçon 37 sur 91.
Défi
FacileConstruisons un système complet de traitement des paiements qui rassemble tout ce que vous avez appris sur le polymorphisme. Vous allez créer une architecture basée sur une interface où différentes méthodes de paiement peuvent être traitées via un processeur unique et unifié — démontrant ainsi comment le polymorphisme rend le code flexible et extensible.
Vous organiserez votre code sur cinq fichiers :
PaymentMethod.php— Définissez une interfacePaymentMethodavec deux signatures de méthode :process(float $amount): stringpour gérer le paiement, et une méthode statiquegetMethodName(): stringqui retourne le nom du type de paiement. Ce contrat garantit que toute méthode de paiement peut être traitée de manière uniforme.CreditCard.php— Créez une classeCreditCardqui implémentePaymentMethod. Incluez le fichier de l'interface. La classe doit avoir une propriété privée$lastFourDigitsdéfinie via le constructeur. Implémentezprocess()pour retourner"Processing $[amount] via Credit Card ending in [lastFourDigits]"(formatez le montant à 2 décimales). Implémentez la méthode statiquegetMethodName()en utilisant le late static binding pour retourner"Credit Card".PayPal.php— Créez une classePayPalqui implémentePaymentMethod. Incluez le fichier de l'interface. La classe doit avoir une propriété privée$emaildéfinie via le constructeur. Implémentezprocess()pour retourner"Processing $[amount] via PayPal account [email]"(formatez le montant à 2 décimales). Implémentez la méthode statiquegetMethodName()pour retourner"PayPal".PaymentProcessor.php— Créez une classePaymentProcessorqui orchestre les paiements. Incluez le fichier de l'interface. Ajoutez une méthodeexecutePayment(PaymentMethod $method, float $amount): stringqui utilise le typage d'interface (type hinting) pour accepter n'importe quelle méthode de paiement. Cette méthode doit retourner le résultat de l'appel àprocess()sur la méthode de paiement. Ajoutez une autre méthodedescribeMethod(PaymentMethod $method): stringqui retourne"Payment via: [methodName]"en utilisant la méthode statiquegetMethodName()de la classe de la méthode de paiement passée.main.php— Incluez tous les fichiers de classe de paiement et le processeur. Créez une instance dePaymentProcessor. Vous recevrez trois entrées : les quatre derniers chiffres d'une carte de crédit, une adresse e-mail PayPal et un montant de paiement. Créez une instance deCreditCardet une instance dePayPalavec leurs identifiants respectifs. Convertissez le montant en float. Utilisez le processeur pour exécuter un paiement avec la carte de crédit d'abord, puis avec PayPal. Affichez chaque résultat sur sa propre ligne. Enfin, affichez la description de la méthode pour la méthode de paiement PayPal.
La beauté de cette conception est que votre PaymentProcessor ne connaît rien spécifiquement des cartes de crédit ou de PayPal — il ne connaît que l'interface PaymentMethod. Vous pourriez ajouter une classe BankTransfer ou Cryptocurrency demain, et le processeur les gérerait sans aucune modification. C'est toute la puissance du polymorphisme basé sur les interfaces combiné au late static binding !
Essayez vous-même
<?php
// Inclure tous les fichiers requis
require_once 'CreditCard.php';
require_once 'PayPal.php';
require_once 'PaymentProcessor.php';
// Lire les entrées
$lastFourDigits = trim(fgets(STDIN));
$paypalEmail = trim(fgets(STDIN));
$amount = floatval(trim(fgets(STDIN)));
// TODO: Créer une instance de PaymentProcessor
// TODO: Créer une instance de CreditCard avec les quatre derniers chiffres
// TODO: Créer une instance de PayPal avec l'e-mail
// TODO: Exécuter le paiement avec la carte de crédit et afficher le résultat
// TODO: Exécuter le paiement avec PayPal et afficher le résultat
// TODO: Afficher la description de la méthode pour le mode de paiement PayPal
?>Toutes les leçons de Programmation Orientée Objet
1Les bases de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition de méthodeLe mot-clé finalClasses abstraitesRécapitulatif - Hiérarchie des employés7Encapsulation
Public, Protégé, PrivéModificateurs d'accès en détailGetters et SettersMasquage d'informationPromotion de constructeur (8.0)Récapitulatif - Système de gestion d'étudiants10Concepts avancés de la POO
Composition vs HéritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibers (PHP 8.1)Clonage d'objets : analyse approfondieGénérateurs et Itérateurs13Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository2Espaces de noms et Autoloading
Introduction aux espaces de nomsLe mot-clé useStandard d'Autoloading PSR-4L'Autoloader ComposerRécapitulatif - Projet organisé5Interfaces et Contrats
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesInterface vs Classe AbstraiteType Hinting avec les InterfacesRécapitulatif - Calculateur de Formes8Méthodes magiques
Introduction aux méthodes magiques__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Clonage d'objets__serialize & __unserializeRécapitulatif - Collection personnalisée3Propriétés de classe
Propriétés d'instance vs Propriétés statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés readonly (PHP 8.1)Récapitulatif - Gestionnaire de compte bancaire6Polymorphisme
Retour sur la redéfinition de méthodePolymorphisme via les interfacesType Hinting et Types d'unionLiaison statique tardiveRécapitulatif - Processeur de paiement9Traits
Introduction aux TraitsUtilisation de plusieurs TraitsRésolution des conflits de TraitsMéthodes abstraites dans les TraitsTraits vs Héritage12Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie