Rückblick – Zahlungsabwickler
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 37 von 91.
Aufgabe
EinfachErstellen wir ein vollständiges Zahlungsabwicklungssystem, das alles zusammenführt, was du über Polymorphie gelernt hast. Du erstellst eine schnittstellenbasierte Architektur, in der verschiedene Zahlungsmethoden über einen einzigen, einheitlichen Prozessor verarbeitet werden können: So wird gezeigt, wie Polymorphie Code flexibel und erweiterbar macht.
Du organisierst deinen Code über fünf Dateien:
PaymentMethod.php: Definiere einPaymentMethod-Interface mit zwei Methodensignaturen:process(float $amount): stringzur Verarbeitung der Zahlung und eine statische MethodegetMethodName(): string, die den Namen des Zahlungstyps zurückgibt. Dieser Vertrag stellt sicher, dass jede Zahlungsmethode einheitlich verarbeitet werden kann.CreditCard.php: Erstelle eineCreditCard-Klasse, diePaymentMethodimplementiert. Binde die Interface-Datei ein. Die Klasse soll eine private Eigenschaft$lastFourDigitsbesitzen, die über den Konstruktor gesetzt wird. Implementiereprocess()so, dass"Processing $[amount] via Credit Card ending in [lastFourDigits]"zurückgegeben wird (formatiere den Betrag mit 2 Dezimalstellen). Implementiere die statische MethodegetMethodName()mithilfe des späten statischen Bindings, sodass"Credit Card"zurückgegeben wird.PayPal.php: Erstelle einePayPal-Klasse, diePaymentMethodimplementiert. Binde die Interface-Datei ein. Die Klasse soll eine private Eigenschaft$emailbesitzen, die über den Konstruktor gesetzt wird. Implementiereprocess()so, dass"Processing $[amount] via PayPal account [email]"zurückgegeben wird (formatiere den Betrag mit 2 Dezimalstellen). Implementiere die statische MethodegetMethodName()so, dass"PayPal"zurückgegeben wird.PaymentProcessor.php: Erstelle einePaymentProcessor-Klasse, die Zahlungen koordiniert. Binde die Interface-Datei ein. Füge eine MethodeexecutePayment(PaymentMethod $method, float $amount): stringhinzu, die mithilfe einer Typdeklaration des Interfaces jede Zahlungsmethode akzeptiert. Diese Methode soll das Ergebnis des Aufrufs vonprocess()für die Zahlungsmethode zurückgeben. Füge außerdem eine MethodedescribeMethod(PaymentMethod $method): stringhinzu, die mithilfe der statischen MethodegetMethodName()aus der Klasse der übergebenen Zahlungsmethode"Payment via: [methodName]"zurückgibt.main.php: Binde alle Dateien der Zahlungsklassen und den Prozessor ein. Erstelle einePaymentProcessor-Instanz. Du erhältst drei Eingaben: die letzten vier Ziffern einer Kreditkarte, eine PayPal-E-Mail-Adresse und einen Zahlungsbetrag. Erstelle sowohl eineCreditCard- als auch einePayPal-Instanz mit ihren jeweiligen Bezeichnern. Konvertiere den Betrag in einen Float. Verwende den Prozessor, um zuerst eine Zahlung mit der Kreditkarte und anschließend mit PayPal auszuführen. Gib jedes Ergebnis in einer eigenen Zeile aus. Gib schließlich die Methodenbeschreibung für die PayPal-Zahlungsmethode aus.
Das Schöne an diesem Design ist, dass dein PaymentProcessor nichts über Kreditkarten oder PayPal im Besonderen wissen muss. Er kennt nur das PaymentMethod-Interface. Du könntest morgen eine BankTransfer- oder Cryptocurrency-Klasse hinzufügen, und der Prozessor würde sie ohne Änderungen verarbeiten. Das ist die Stärke der schnittstellenbasierten Polymorphie in Verbindung mit spätem statischem Binding!
Probier es selbst
<?php
// Alle erforderlichen Dateien einbinden
require_once 'CreditCard.php';
require_once 'PayPal.php';
require_once 'PaymentProcessor.php';
// Eingaben lesen
$lastFourDigits = trim(fgets(STDIN));
$paypalEmail = trim(fgets(STDIN));
$amount = floatval(trim(fgets(STDIN)));
// TODO: Eine PaymentProcessor-Instanz erstellen
// TODO: Eine CreditCard-Instanz mit den letzten vier Ziffern erstellen
// TODO: Eine PayPal-Instanz mit der E-Mail erstellen
// TODO: Zahlung mit Kreditkarte ausführen und das Ergebnis ausgeben
// TODO: Zahlung mit PayPal ausführen und das Ergebnis ausgeben
// TODO: Die Methodenbeschreibung für die PayPal-Zahlungsmethode ausgeben
?>Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in OOPKlassen vs. ObjekteDas Schlüsselwort $thisMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDas Schlüsselwort parent::MethodenüberschreibungDas Schlüsselwort finalAbstrakte KlassenRückblick – Mitarbeiterhierarchie7Kapselung
Öffentlich, geschützt, privatZugriffsmodifikatoren im DetailGetter und SetterInformationsverbergungKonstruktor-Promotion (8.0)Wiederholung – System zur Verwaltung von Schülerdatensätzen2Namespaces & Autoloading
Einführung in NamespacesDas use-SchlüsselwortPSR-4-Autoloading-StandardComposer-AutoloaderRückblick – Organisiertes Projekt5Schnittstellen & Verträge
Einführung in SchnittstellenSchnittstellen implementierenMehrere Schnittstellen implementierenSchnittstelle vs. abstrakte KlasseTyp-Hinweise mit SchnittstellenRückblick – Formrechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objektklonen__serialize & __unserializeRückblick – Benutzerdefinierte Sammlung11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenBenutzerdefinierte Exception-HierarchieTry, Catch, FinallyRückblick – Formularvalidator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klassen-Eigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenSchreibgeschützte Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphie
Methodenüberschreibung erneut betrachtetPolymorphie über SchnittstellenTyp-Hinweise & Union-TypenSpätes statisches BindenRückblick – Zahlungsabwickler9Traits
Einführung in TraitsMehrere Traits verwendenAuflösung von Trait-KonfliktenAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungÜbe selbstständig: Online-PHP-Compiler