まとめ:決済プロセッサー
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 37/91。
チャレンジ
簡単ポリモーフィズムについて学んだすべてを統合した、完全な決済処理システムを構築しましょう。インターフェースベースのアーキテクチャを作成し、異なる決済方法を単一の統一されたプロセッサで処理できるようにします。これにより、ポリモーフィズムがいかにコードを柔軟で拡張可能にするかを実証します。
コードは5つのファイルに分けて構成します:
PaymentMethod.php— 2つのメソッドシグネチャを持つPaymentMethodインターフェースを定義します。決済を処理するためのprocess(float $amount): stringと、決済タイプの名前を返す静的メソッドgetMethodName(): stringです。この規約により、あらゆる決済方法を統一的に処理できるようになります。CreditCard.php—PaymentMethodを実装するCreditCardクラスを作成します。インターフェースファイルをインクルードしてください。このクラスは、コンストラクタを通じて設定されるプライベートな$lastFourDigitsプロパティを持つ必要があります。process()を実装し、"Processing $[amount] via Credit Card ending in [lastFourDigits]"を返すようにします(金額は小数点以下2桁にフォーマットしてください)。遅延静的束縛(late static binding)を使用して"Credit Card"を返すように静的なgetMethodName()を実装します。PayPal.php—PaymentMethodを実装する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つの入力を受け取ります。それぞれの識別子を使用して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: 下4桁の番号を使用して CreditCard インスタンスを作成する
// TODO: メールアドレスを使用して PayPal インスタンスを作成する
// TODO: クレジットカードで支払いを実行し、結果を出力する
// TODO: PayPal で支払いを実行し、結果を出力する
// TODO: PayPal 支払いメソッドのメソッド説明を出力する
?>