Podsumowanie — procesor płatności
Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 37 z 91.
Wyzwanie
ŁatwyZbudujmy kompletny system przetwarzania płatności, który łączy wszystko, czego nauczyłeś się o polimorfizmie. Stworzysz architekturę opartą na interfejsie, w której różne metody płatności można obsługiwać za pomocą jednego, ujednoliconego procesora — pokażemy, jak polimorfizm sprawia, że kod jest elastyczny i łatwy do rozszerzania.
Uporządkujesz kod w pięciu plikach:
PaymentMethod.php: Zdefiniuj interfejsPaymentMethodz dwoma sygnaturami metod:process(float $amount): stringdo obsługi płatności oraz metodą statycznągetMethodName(): string, która zwraca nazwę typu płatności. Ten kontrakt gwarantuje, że każdą metodę płatności można obsługiwać w jednolity sposób.CreditCard.php: Utwórz klasęCreditCard, która implementujePaymentMethod. Dołącz plik interfejsu. Klasa powinna mieć prywatną właściwość$lastFourDigits, ustawianą przez konstruktor. Zaimplementujprocess(), aby zwracała"Processing $[amount] via Credit Card ending in [lastFourDigits]"(sformatuj kwotę do 2 miejsc po przecinku). Zaimplementuj statyczną metodęgetMethodName(), używając późnego wiązania statycznego, aby zwracała"Credit Card".PayPal.php: Utwórz klasęPayPal, która implementujePaymentMethod. Dołącz plik interfejsu. Klasa powinna mieć prywatną właściwość$email, ustawianą przez konstruktor. Zaimplementujprocess(), aby zwracała"Processing $[amount] via PayPal account [email]"(sformatuj kwotę do 2 miejsc po przecinku). Zaimplementuj statyczną metodęgetMethodName(), aby zwracała"PayPal".PaymentProcessor.php: Utwórz klasęPaymentProcessor, która koordynuje płatności. Dołącz plik interfejsu. Dodaj metodęexecutePayment(PaymentMethod $method, float $amount): string, która używa wskazówki typu interfejsu, aby akceptować dowolną metodę płatności. Ta metoda powinna zwracać wynik wywołaniaprocess()dla metody płatności. Dodaj kolejną metodędescribeMethod(PaymentMethod $method): string, która zwraca"Payment via: [methodName]", używając statycznej metodygetMethodName()z klasy przekazanej metody płatności.main.php: Dołącz wszystkie pliki klas płatności oraz plik procesora. Utwórz instancjęPaymentProcessor. Otrzymasz trzy dane wejściowe: ostatnie cztery cyfry karty kredytowej, adres e-mail PayPal i kwotę płatności. Utwórz instancjeCreditCardiPayPal, przekazując im odpowiednie identyfikatory. Przekonwertuj kwotę na liczbę zmiennoprzecinkową. Użyj procesora, aby najpierw zrealizować płatność kartą kredytową, a następnie przez PayPal. Wypisz każdy wynik w osobnym wierszu. Na koniec wypisz opis metody płatności PayPal.
Piękno tego projektu polega na tym, że PaymentProcessor nie wie nic konkretnego o kartach kredytowych ani PayPal. Zna tylko interfejs PaymentMethod. Jutro możesz dodać klasę BankTransfer lub Cryptocurrency, a procesor będzie je obsługiwać bez żadnych modyfikacji. Na tym polega siła polimorfizmu opartego na interfejsach w połączeniu z późnym wiązaniem statycznym!
Spróbuj swoich sił
<?php
// Dołącz wszystkie wymagane pliki
require_once 'CreditCard.php';
require_once 'PayPal.php';
require_once 'PaymentProcessor.php';
// Odczytaj dane wejściowe
$lastFourDigits = trim(fgets(STDIN));
$paypalEmail = trim(fgets(STDIN));
$amount = floatval(trim(fgets(STDIN)));
// TODO: Utwórz instancję PaymentProcessor
// TODO: Utwórz instancję CreditCard z ostatnimi czterema cyframi
// TODO: Utwórz instancję PayPal z adresem e-mail
// TODO: Wykonaj płatność kartą kredytową i wypisz wynik
// TODO: Wykonaj płatność przez PayPal i wypisz wynik
// TODO: Wypisz opis metody płatności PayPal
?>Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe $thisMetodyWłaściwościKonstruktor (__construct)Destruktor (__destruct)Powtórka — prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe parent::Przesłanianie metodSłowo kluczowe finalKlasy abstrakcyjnePowtórzenie – hierarchia pracowników7Enkapsulacja
Public, protected, privateModyfikatory dostępu w szczegółachGettery i setteryUkrywanie informacjiPromocja parametrów konstruktora (8.0)Podsumowanie — system ewidencji studentów2Przestrzenie nazw i autoloading
Wprowadzenie do przestrzeni nazwSłowo kluczowe useStandard autoloadingu PSR-4Autoloader ComposeraPodsumowanie – uporządkowany projekt5Interfejsy i kontrakty
Wprowadzenie do interfejsówImplementowanie interfejsówImplementowanie wielu interfejsówInterfejs a klasa abstrakcyjnaPodpowiadanie typów za pomocą interfejsówPodsumowanie — kalkulator kształtów8Metody magiczne
Wprowadzenie do metod magicznych__toString i __debugInfo__get, __set, __isset, __unset__call i __callStatic__clone i klonowanie obiektów__serialize i __unserializePodsumowanie — własna kolekcja11System typów i obsługa błędów
Deklaracje typówTypy nullableTypy sumy i przecięciaKlasy wyjątkówNiestandardowa hierarchia wyjątkówTry, Catch, FinallyPodsumowanie — walidator formularzy14Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Właściwości klas
Właściwości instancji a właściwości statyczneStałe w klasachMetody i właściwości statyczneWłaściwości prywatne i chronioneWłaściwości tylko do odczytu (PHP 8.1)Podsumowanie — menedżer kont bankowych6Polimorfizm
Ponowne omówienie nadpisywania metodPolimorfizm za pomocą interfejsówPodpowiedzi typów i typy sumyPóźne wiązanie statycznePodsumowanie — procesor płatności9Cechy
Wprowadzenie do cechKorzystanie z wielu cechRozwiązywanie konfliktów cechMetody abstrakcyjne w cechachCechy a dziedziczenie12Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator PHP online