Menu
Coddy logo textTech

Повторение — обработчик платежей

Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 37 из 91.

challenge icon

Задание

Легко

Давайте создадим полноценную систему обработки платежей, которая объединит всё, что вы узнали о полиморфизме. Вы создадите архитектуру на основе интерфейса, в которой различные способы оплаты можно обрабатывать через единый унифицированный процессор: это демонстрирует, как полиморфизм делает код гибким и расширяемым.

Вы организуете код в пяти файлах:

  • 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
?>

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор PHP