回顾:支付处理器
本课属于 Coddy PHP 学习旅程的“面向对象编程”单元。第 37 课,共 91 课。
挑战
简单让我们构建一个完整的支付处理系统,把你学过的多态知识融会贯通。你将创建一种基于接口的架构,让不同的支付方式都能通过一个统一的处理器进行处理,展示多态如何让代码更灵活、更易扩展。
你将把代码分成 5 个文件:
PaymentMethod.php:定义一个PaymentMethod接口,其中包含两个方法签名:process(float $amount): string用于处理支付,以及一个静态方法getMethodName(): string,用于返回支付类型名称。这个约定确保所有支付方式都能以统一的方式处理。CreditCard.php:创建一个实现PaymentMethod的CreditCard类。引入接口文件。这个类应包含一个私有的$lastFourDigits属性,并通过构造函数设置它。实现process(),使其返回"Processing $[amount] via Credit Card ending in [lastFourDigits]"(将金额格式化为 2 位小数)。实现静态方法getMethodName(),使用延迟静态绑定返回"Credit Card"。PayPal.php:创建一个实现PaymentMethod的PayPal类。引入接口文件。这个类应包含一个私有的$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,使用传入支付方式所属类的静态方法getMethodName(),并返回"Payment via: [methodName]"。main.php:引入所有支付类文件和处理器。创建一个PaymentProcessor实例。你将收到 3 个输入:信用卡的后四位数字、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 实例
// TODO: 使用信用卡付款并打印结果
// TODO: 使用 PayPal 付款并打印结果
// TODO: 打印 PayPal 支付方式的方法描述
?>面向对象编程中的所有课
自己练习: PHP 在线编译器