Итоги — Payment Processor
Часть раздела Объектно-ориентированное программирование путешествия по 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]"(отформатируйте сумму до 2 знаков после запятой). Реализуйте статический методgetMethodName(), используя позднее статическое связывание, чтобы вернуть"Credit Card".PayPal.php— Создайте классPayPal, который реализуетPaymentMethod. Подключите файл интерфейса. Класс должен иметь приватное свойство$email, устанавливаемое через конструктор. Реализуйтеprocess(), чтобы он возвращал"Processing $[amount] via PayPal account [email]"(отформатируйте сумму до 2 знаков после запятой). Реализуйте статический метод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с их соответствующими идентификаторами. Преобразуйте сумму в float. Используйте процессор для выполнения платежа сначала с помощью кредитной карты, а затем с помощью 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 с адресом электронной почты
// TODO: Выполнить платеж с помощью кредитной карты и вывести результат
// TODO: Выполнить платеж с помощью PayPal и вывести результат
// TODO: Вывести описание метода для способа оплаты PayPal
?>Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Итоги — Простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыИтоги — Иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateПодробный разбор модификаторов доступаГеттеры и сеттерыСокрытие данныхConstructor Promotion (8.0)Итоги — Система учета студентов10Продвинутые концепции ООП
Композиция против наследованияВнедрение зависимостейАнонимные классыПеречисления (PHP 8.1)Файберы (PHP 8.1)Глубокое погружение в клонирование объектовГенераторы и итераторы13Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий2Пространства имен и автозагрузка
Введение в пространства именКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerИтоги: структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс против абстрактного классаType Hinting с интерфейсамиИтоги — Калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeИтоги — Кастомная коллекция11Система типов и обработка ошибок
Объявление типовNullable-типыТипы объединения и пересеченияКлассы исключенийИерархия пользовательских исключенийTry, Catch, FinallyИтоги — Валидатор форм14Проект: Управление библиотекой
Обзор проектаКлассы Book и User3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищенные свойстваСвойства Readonly (PHP 8.1)Итоги — Менеджер банковского счета6Полиморфизм
Снова о переопределении методовПолиморфизм через интерфейсыType Hinting и Union TypesПозднее статическое связываниеИтоги — Payment Processor9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy