Menu
Coddy logo textTech

Итоги — Payment Processor

Часть раздела Объектно-ориентированное программирование путешествия по 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]" (отформатируйте сумму до 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
?>

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