Повторение — обработчик платежей
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 37 из 91.
Задание
ЛегкоДавайте создадим полноценную систему обработки платежей, которая объединит всё, что вы узнали о полиморфизме. Вы создадите архитектуру на основе интерфейса, в которой различные способы оплаты можно обрабатывать через единый унифицированный процессор: это демонстрирует, как полиморфизм делает код гибким и расширяемым.
Вы организуете код в пяти файлах:
PaymentMethod.php: Определите интерфейсPaymentMethodс двумя сигнатурами методов:process(float $amount): stringдля обработки платежа и статическим методомgetMethodName(): string, который возвращает название типа платежа. Этот контракт гарантирует, что любой способ оплаты можно обрабатывать единообразно.CreditCard.php: Создайте классCreditCard, реализующийPaymentMethod. Подключите файл интерфейса. У класса должно быть приватное свойство$lastFourDigits, устанавливаемое через конструктор. Реализуйтеprocess(), чтобы он возвращал"Processing $[amount] via Credit Card ending in [lastFourDigits]"(форматируйте сумму с двумя знаками после десятичной точки). Реализуйте статическийgetMethodName()с использованием позднего статического связывания, чтобы он возвращал"Credit Card".PayPal.php: Создайте классPayPal, реализующийPaymentMethod. Подключите файл интерфейса. У класса должно быть приватное свойство$email, устанавливаемое через конструктор. Реализуйтеprocess(), чтобы он возвращал"Processing $[amount] via PayPal account [email]"(форматируйте сумму с двумя знаками после десятичной точки). Реализуйте статическийgetMethodName(), чтобы он возвращал"PayPal".PaymentProcessor.php: Создайте классPaymentProcessor, который координирует платежи. Подключите файл интерфейса. Добавьте методexecutePayment(PaymentMethod $method, float $amount): string, использующий подсказку типа интерфейса для принятия любого способа оплаты. Этот метод должен возвращать результат вызоваprocess()для способа оплаты. Добавьте ещё один методdescribeMethod(PaymentMethod $method): string, который возвращает"Payment via: [methodName]", используя статическийgetMethodName()из класса переданного способа оплаты.main.php: Подключите все файлы классов способов оплаты и процессор. Создайте экземплярPaymentProcessor. Вы получите три входных значения: последние четыре цифры кредитной карты, адрес электронной почты PayPal и сумму платежа. Создайте экземплярыCreditCardиPayPalс соответствующими идентификаторами. Преобразуйте сумму в число с плавающей точкой. Используйте процессор, чтобы сначала выполнить платёж с кредитной картой, а затем с PayPal. Выведите каждый результат в отдельной строке. Наконец, выведите описание способа оплаты PayPal.
Преимущество такой конструкции в том, что ваш PaymentProcessor ничего конкретного не знает о кредитных картах или PayPal. Он знает только об интерфейсе PaymentMethod. Вы можете добавить класс BankTransfer или Cryptocurrency уже завтра, и процессор обработает их без каких-либо изменений. В этом и заключается сила полиморфизма на основе интерфейсов в сочетании с поздним статическим связыванием!
Попробуйте сами
<?php
// Подключить все необходимые файлы
require_once 'CreditCard.php';
require_once 'PayPal.php';
require_once 'PaymentProcessor.php';
// Прочитать входные данные
$lastFourDigits = trim(fgets(STDIN));
$paypalEmail = trim(fgets(STDIN));
$amount = floatval(trim(fgets(STDIN)));
// TODO: Создать экземпляр PaymentProcessor
// TODO: Создать экземпляр CreditCard с последними четырьмя цифрами
// TODO: Создать экземпляр PayPal с email
// TODO: Выполнить оплату кредитной картой и вывести результат
// TODO: Выполнить оплату через PayPal и вывести результат
// TODO: Вывести описание метода для способа оплаты PayPal
?>Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Повторение — простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыПовторение — иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateМодификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (8.0)Повторение — система учёта студентов2Пространства имён и автозагрузка
Введение в пространства имёнКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerПовторение — структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс и абстрактный классАннотация типов с интерфейсамиПовторение — калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeПовторение — пользовательская коллекция3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищённые свойстваСвойства только для чтения (PHP 8.1)Повторение — менеджер банковского счёта6Полиморфизм
Повторение переопределения методовПолиморфизм через интерфейсыАннотации типов и объединённые типыПозднее статическое связываниеПовторение — обработчик платежей9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования, часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн StrategyПотренируйтесь самостоятельно: Онлайн-компилятор PHP