Riepilogo - Processore di pagamenti
Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 37 di 91.
Sfida
FacileCostruiamo un sistema completo di elaborazione dei pagamenti che riunisce tutto ciò che hai imparato sul polimorfismo. Creerai un’architettura basata su interfacce in cui diversi metodi di pagamento possono essere elaborati tramite un unico processore unificato: dimostrando come il polimorfismo renda il codice flessibile ed estensibile.
Organizzerai il codice in cinque file:
PaymentMethod.php: Definisci un’interfacciaPaymentMethodcon due firme di metodo:process(float $amount): stringper gestire il pagamento e un metodo staticogetMethodName(): stringche restituisce il nome del tipo di pagamento. Questo contratto garantisce che qualsiasi metodo di pagamento possa essere elaborato in modo uniforme.CreditCard.php: Crea una classeCreditCardche implementaPaymentMethod. Includi il file dell’interfaccia. La classe deve avere una proprietà privata$lastFourDigitsimpostata tramite il costruttore. Implementaprocess()in modo che restituisca"Processing $[amount] via Credit Card ending in [lastFourDigits]"(formatta l’importo con 2 cifre decimali). Implementa il metodo staticogetMethodName()usando il binding statico tardivo per restituire"Credit Card".PayPal.php: Crea una classePayPalche implementaPaymentMethod. Includi il file dell’interfaccia. La classe deve avere una proprietà privata$emailimpostata tramite il costruttore. Implementaprocess()in modo che restituisca"Processing $[amount] via PayPal account [email]"(formatta l’importo con 2 cifre decimali). Implementa il metodo staticogetMethodName()in modo che restituisca"PayPal".PaymentProcessor.php: Crea una classePaymentProcessorche coordina i pagamenti. Includi il file dell’interfaccia. Aggiungi un metodoexecutePayment(PaymentMethod $method, float $amount): stringche usa il type hinting dell’interfaccia per accettare qualsiasi metodo di pagamento. Questo metodo deve restituire il risultato della chiamata aprocess()sul metodo di pagamento. Aggiungi un altro metododescribeMethod(PaymentMethod $method): stringche restituisce"Payment via: [methodName]"usando il metodo staticogetMethodName()della classe del metodo di pagamento passato.main.php: Includi tutti i file delle classi di pagamento e il processore. Crea un’istanza diPaymentProcessor. Riceverai tre input: le ultime quattro cifre di una carta di credito, un indirizzo email PayPal e un importo da pagare. Crea un’istanza diCreditCarde una diPayPalcon i rispettivi identificativi. Converti l’importo in un float. Usa il processore per eseguire prima un pagamento con la carta di credito e poi con PayPal. Stampa ciascun risultato su una riga separata. Infine, stampa la descrizione del metodo di pagamento PayPal.
La bellezza di questo design è che il tuo PaymentProcessor non sa nulla nello specifico delle carte di credito o di PayPal. Conosce solo l’interfaccia PaymentMethod. Domani potresti aggiungere una classe BankTransfer o Cryptocurrency, e il processore le gestirebbe senza alcuna modifica. Questa è la potenza del polimorfismo basato su interfacce combinato con il binding statico tardivo!
Provalo tu
<?php
// Includi tutti i file necessari
require_once 'CreditCard.php';
require_once 'PayPal.php';
require_once 'PaymentProcessor.php';
// Leggi gli input
$lastFourDigits = trim(fgets(STDIN));
$paypalEmail = trim(fgets(STDIN));
$amount = floatval(trim(fgets(STDIN)));
// TODO: Crea un'istanza di PaymentProcessor
// TODO: Crea un'istanza di CreditCard con le ultime quattro cifre
// TODO: Crea un'istanza di PayPal con l'indirizzo email
// TODO: Esegui il pagamento con carta di credito e stampa il risultato
// TODO: Esegui il pagamento con PayPal e stampa il risultato
// TODO: Stampa la descrizione del metodo di pagamento PayPal
?>Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave $thisMetodiProprietàCostruttore (__construct)Distruttore (__destruct)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa parola chiave parent::Sovrascrittura dei metodiLa parola chiave finalClassi astratteRiepilogo - Gerarchia dei dipendenti7Incapsulamento
Pubblico, Protetto, PrivatoApprofondimento sui modificatori di accessoGetter e SetterOccultamento delle informazioniPromozione dei parametri del costruttore (8.0)Riepilogo - Sistema di gestione dei registri degli studenti10Concetti avanzati di programmazione a oggetti
Composizione vs ereditarietàDependency InjectionClassi anonimeEnumerazioni (PHP 8.1)Fibers (PHP 8.1)Approfondimento sulla clonazione degli oggettiGeneratori e iteratori13Modelli di progettazione, parte 2
Modello CommandModello AdapterModello DecoratorModello Template MethodModello StateModello CompositeModello Repository2Namespace e autoloading
Introduzione ai namespaceLa keyword useStandard di autoloading PSR-4Autoloader di ComposerRiepilogo - Progetto organizzato5Interfacce e contratti
Introduzione alle interfacceImplementare le interfacceImplementare più interfacceInterfaccia vs classe astrattaType hinting con le interfacceRiepilogo - Calcolatore di forme8Metodi magici
Introduzione ai metodi magici__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e clonazione degli oggetti__serialize e __unserializeRiepilogo - Collezione personalizzata11Sistema dei tipi e gestione degli errori
Dichiarazioni di tipoTipi nullableTipi unione e intersezioneClassi di eccezioneGerarchia di eccezioni personalizzataTry, Catch, FinallyRiepilogo - Validatore di moduli14Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Proprietà delle classi
Proprietà di istanza e staticheCostanti nelle classiMetodi e proprietà staticiProprietà private e protectedProprietà readonly (PHP 8.1)Riepilogo - Gestore di conti bancari6Polimorfismo
Ridefinizione dei metodi, ripresaPolimorfismo tramite interfacceSuggerimenti sui tipi e tipi UnionBinding statico tardivoRiepilogo - Processore di pagamenti9Tratti
Introduzione ai trattiUtilizzare più trattiRisoluzione dei conflitti tra trattiMetodi astratti nei trattiTratti vs ereditarietà12Design pattern - Parte 1
Introduzione ai design patternPattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore PHP online