Menu
Coddy logo textTech

まとめ:決済プロセッサー

CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 37/91。

challenge icon

チャレンジ

簡単

ポリモーフィズムについて学んだすべてを統合した、完全な決済処理システムを構築しましょう。インターフェースベースのアーキテクチャを作成し、異なる決済方法を単一の統一されたプロセッサで処理できるようにします。これにより、ポリモーフィズムがいかにコードを柔軟で拡張可能にするかを実証します。

コードは5つのファイルに分けて構成します:

  • PaymentMethod.php — 2つのメソッドシグネチャを持つ PaymentMethod インターフェースを定義します。決済を処理するための process(float $amount): string と、決済タイプの名前を返す静的メソッド getMethodName(): string です。この規約により、あらゆる決済方法を統一的に処理できるようになります。
  • CreditCard.phpPaymentMethod を実装する CreditCard クラスを作成します。インターフェースファイルをインクルードしてください。このクラスは、コンストラクタを通じて設定されるプライベートな $lastFourDigits プロパティを持つ必要があります。process() を実装し、"Processing $[amount] via Credit Card ending in [lastFourDigits]" を返すようにします(金額は小数点以下2桁にフォーマットしてください)。遅延静的束縛(late static binding)を使用して "Credit Card" を返すように静的な getMethodName() を実装します。
  • PayPal.phpPaymentMethod を実装する PayPal クラスを作成します。インターフェースファイルをインクルードしてください。このクラスは、コンストラクタを通じて設定されるプライベートな $email プロパティを持つ必要があります。process() を実装し、"Processing $[amount] via PayPal account [email]" を返すようにします(金額は小数点以下2桁にフォーマットしてください)。"PayPal" を返すように静的な getMethodName() を実装します。
  • PaymentProcessor.php — 決済をオーケストレートする PaymentProcessor クラスを作成します。インターフェースファイルをインクルードしてください。インターフェースの型ヒンティングを使用して任意の決済方法を受け入れる executePayment(PaymentMethod $method, float $amount): string メソッドを追加します。このメソッドは、決済方法の process() を呼び出した結果を返す必要があります。また、渡された決済方法のクラスから静的な getMethodName() を使用して "Payment via: [methodName]" を返す describeMethod(PaymentMethod $method): string メソッドを追加します。
  • main.php — すべての決済クラスファイルとプロセッサをインクルードします。PaymentProcessor のインスタンスを作成します。クレジットカードの下4桁、PayPalのメールアドレス、および決済金額の3つの入力を受け取ります。それぞれの識別子を使用して CreditCardPayPal の両方のインスタンスを作成します。金額を float に変換します。プロセッサを使用して、最初にクレジットカードで、次に PayPal で決済を実行します。各結果をそれぞれの行に出力します。最後に、PayPal 決済方法のメソッド説明を出力します。

この設計の素晴らしい点は、PaymentProcessor がクレジットカードや PayPal について具体的に何も知らないことです。知っているのは PaymentMethod インターフェースのことだけです。明日 BankTransferCryptocurrency クラスを追加したとしても、プロセッサは一切の変更なしにそれらを処理できます。これが、インターフェースベースのポリモーフィズムと遅延静的束縛を組み合わせたパワーです!

自分で試してみよう

<?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: 下4桁の番号を使用して CreditCard インスタンスを作成する

// TODO: メールアドレスを使用して PayPal インスタンスを作成する

// TODO: クレジットカードで支払いを実行し、結果を出力する

// TODO: PayPal で支払いを実行し、結果を出力する

// TODO: PayPal 支払いメソッドのメソッド説明を出力する
?>

オブジェクト指向プログラミングのすべてのレッスン