復習 - 支払い処理
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 37/91。
チャレンジ
簡単ポリモーフィズムについて学んだすべてを組み合わせて、完全な支払い処理システムを構築しましょう。異なる支払い方法を、単一の統合されたプロセッサーで処理できるインターフェースベースのアーキテクチャを作成します。これにより、ポリモーフィズムによってコードが柔軟かつ拡張可能になることを示します。
コードを5つのファイルに整理します。
PaymentMethod.php:2つのメソッドシグネチャを持つPaymentMethodインターフェースを Define します。支払いを処理するためのprocess(float $amount): stringと、支払いタイプ名を返す static メソッドgetMethodName(): stringです。この契約により、あらゆる支払い方法を統一的に処理できます。CreditCard.php:PaymentMethodを implements するCreditCardクラスを Create します。インターフェースファイルを Include します。このクラスには、constructor を通じて設定される private な$lastFourDigitsプロパティを持たせます。process()を Implement し、"Processing $[amount] via Credit Card ending in [lastFourDigits]"を返すようにします(amount は小数点以下2桁に Format します)。static なgetMethodName()は late static binding を使用して"Credit Card"を返すように Implement します。PayPal.php:PaymentMethodを implements するPayPalクラスを Create します。インターフェースファイルを Include します。このクラスには、constructor を通じて設定される private な$emailプロパティを持たせます。process()を Implement し、"Processing $[amount] via PayPal account [email]"を返すようにします(amount は小数点以下2桁に Format します)。static なgetMethodName()は"PayPal"を返すように Implement します。PaymentProcessor.php:支払いを調整するPaymentProcessorクラスを Create します。インターフェースファイルを Include します。インターフェースの型ヒントを使用して任意の支払い方法を accept するexecutePayment(PaymentMethod $method, float $amount): stringメソッドを Add します。このメソッドは、支払い方法に対してprocess()を calling した結果を返します。さらに、渡された支払い方法のクラスから static なgetMethodName()を使用して"Payment via: [methodName]"を返すdescribeMethod(PaymentMethod $method): stringメソッドを Add します。main.php:すべての支払いクラスのファイルとプロセッサーを Include します。PaymentProcessorの instance を Create します。3つの inputs、つまりクレジットカードの last four digits、PayPal の email アドレス、支払い amount を受け取ります。それぞれの identifier を使用してCreditCardとPayPalの両方の instance を Create します。amount を float に変換します。プロセッサーを使用して、まずクレジットカードで支払いを Execute し、次に PayPal で Execute します。それぞれの結果を独自の行に Print します。最後に、PayPal の支払い方法のメソッドの説明を Print します。
この設計の優れた点は、PaymentProcessor がクレジットカードや PayPal について具体的には何も知らなくてよいことです。PaymentMethod インターフェースについてのみ知っています。明日 BankTransfer クラスや Cryptocurrency クラスを Add したとしても、プロセッサーは一切変更することなくそれらを処理できます。これが、インターフェースベースのポリモーフィズムと late static binding を組み合わせる power です。
自分で試してみよう
<?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 支払い方法のメソッドの説明を出力する
?>オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: PHPオンラインコンパイラ