本文目录导读:

我来通过一个具体实例演示PHP面向接口编程的核心概念。
完整实例:支付系统
定义支付接口
<?php
// 支付接口
interface PaymentInterface {
public function pay($amount);
public function refund($orderId);
public function getStatus($orderId);
public function validate();
}
// 可通知接口(可选扩展)
interface NotifiableInterface {
public function sendNotification($message);
}
实现具体支付类
<?php
// 支付宝支付实现
class AlipayPayment implements PaymentInterface, NotifiableInterface {
private $config;
public function __construct($config) {
$this->config = $config;
}
public function pay($amount) {
// 支付宝支付逻辑
$orderId = $this->createOrder('alipay', $amount);
echo "支付宝支付: ¥{$amount},订单号: {$orderId}\n";
return $orderId;
}
public function refund($orderId) {
// 退款逻辑
echo "支付宝退款,订单号: {$orderId}\n";
return true;
}
public function getStatus($orderId) {
// 查询状态
return "SUCCESS";
}
public function validate() {
// 验证配置
return isset($this->config['app_id']) && isset($this->config['private_key']);
}
public function sendNotification($message) {
echo "支付宝通知: {$message}\n";
}
private function createOrder($type, $amount) {
return uniqid($type . '_');
}
}
// 微信支付实现
class WechatPayment implements PaymentInterface {
private $config;
public function __construct($config) {
$this->config = $config;
}
public function pay($amount) {
$orderId = uniqid('wechat_');
echo "微信支付: ¥{$amount},订单号: {$orderId}\n";
return $orderId;
}
public function refund($orderId) {
echo "微信退款,订单号: {$orderId}\n";
return true;
}
public function getStatus($orderId) {
return "PENDING";
}
public function validate() {
return isset($this->config['mch_id']) && isset($this->config['api_key']);
}
}
// 银行卡支付
class BankCardPayment implements PaymentInterface {
private $config;
public function __construct($config) {
$this->config = $config;
}
public function pay($amount) {
$orderId = uniqid('bank_');
echo "银行卡支付: ¥{$amount},订单号: {$orderId}\n";
return $orderId;
}
public function refund($orderId) {
echo "银行卡退款,订单号: {$orderId}\n";
return true;
}
public function getStatus($orderId) {
return "PROCESSING";
}
public function validate() {
return isset($this->config['merchant_id']);
}
}
使用接口的服务类
<?php
// 订单服务类 - 依赖接口而非具体实现
class OrderService {
private $payment;
private $notifier;
public function __construct(PaymentInterface $payment) {
$this->payment = $payment;
// 检查支付对象是否实现了通知接口
if ($payment instanceof NotifiableInterface) {
$this->notifier = $payment;
}
}
public function processOrder($orderId, $amount) {
// 验证支付配置
if (!$this->payment->validate()) {
throw new Exception("支付配置无效");
}
// 执行支付
$paymentOrderId = $this->payment->pay($amount);
// 发送通知(如果支持)
if ($this->notifier) {
$this->notifier->sendNotification("订单 {$orderId} 支付成功");
}
// 更新订单状态
$this->updateOrderStatus($orderId, 'PAID', $paymentOrderId);
return $paymentOrderId;
}
public function processRefund($orderId) {
$this->payment->refund($orderId);
$this->updateOrderStatus($orderId, 'REFUNDED');
}
public function checkPaymentStatus($orderId) {
return $this->payment->getStatus($orderId);
}
private function updateOrderStatus($orderId, $status, $paymentOrderId = null) {
echo "更新订单 {$orderId} 状态为: {$status}\n";
}
}
// 支付工厂类 - 创建支付实例
class PaymentFactory {
public static function create($type, $config) {
switch ($type) {
case 'alipay':
return new AlipayPayment($config);
case 'wechat':
return new WechatPayment($config);
case 'bank':
return new BankCardPayment($config);
default:
throw new Exception("不支持的支付类型");
}
}
}
测试和使用示例
<?php
// 测试代码
try {
// 配置
$alipayConfig = [
'app_id' => '202100012345',
'private_key' => 'test_private_key'
];
$wechatConfig = [
'mch_id' => '123456789',
'api_key' => 'test_api_key'
];
$bankConfig = [
'merchant_id' => 'merchant123',
'terminal_id' => 'terminal001'
];
// 使用工厂创建支付实例
$alipay = PaymentFactory::create('alipay', $alipayConfig);
$wechat = PaymentFactory::create('wechat', $wechatConfig);
$bank = PaymentFactory::create('bank', $bankConfig);
// 创建订单服务
$alipayOrderService = new OrderService($alipay);
$wechatOrderService = new OrderService($wechat);
$bankOrderService = new OrderService($bank);
// 处理订单
echo "=== 支付宝订单 ===\n";
$alipayOrderService->processOrder('ORDER001', 100.50);
$alipayOrderService->processRefund('ORDER001');
echo "支付状态: " . $alipayOrderService->checkPaymentStatus('ORDER001') . "\n\n";
echo "=== 微信订单 ===\n";
$wechatOrderService->processOrder('ORDER002', 200.00);
echo "支付状态: " . $wechatOrderService->checkPaymentStatus('ORDER002') . "\n\n";
echo "=== 银行卡订单 ===\n";
$bankOrderService->processOrder('ORDER003', 300.75);
echo "支付状态: " . $bankOrderService->checkPaymentStatus('ORDER003') . "\n";
} catch (Exception $e) {
echo "错误: " . $e->getMessage() . "\n";
}
更复杂的接口应用:策略模式
<?php
// 优惠策略接口
interface DiscountStrategyInterface {
public function calculateDiscount($amount);
}
// 具体策略
class NoDiscount implements DiscountStrategyInterface {
public function calculateDiscount($amount) {
return 0;
}
}
class PercentageDiscount implements DiscountStrategyInterface {
private $percent;
public function __construct($percent) {
$this->percent = $percent;
}
public function calculateDiscount($amount) {
return $amount * ($this->percent / 100);
}
}
class FixedDiscount implements DiscountStrategyInterface {
private $discountAmount;
public function __construct($amount) {
$this->discountAmount = $amount;
}
public function calculateDiscount($amount) {
return min($this->discountAmount, $amount);
}
}
// 订单价格计算器
class PriceCalculator {
private $discountStrategy;
public function __construct(DiscountStrategyInterface $strategy) {
$this->discountStrategy = $strategy;
}
public function setStrategy(DiscountStrategyInterface $strategy) {
$this->discountStrategy = $strategy;
}
public function calculate($originalPrice) {
$discount = $this->discountStrategy->calculateDiscount($originalPrice);
return $originalPrice - $discount;
}
}
// 策略模式测试
echo "=== 策略模式示例 ===\n";
$calculator = new PriceCalculator(new NoDiscount());
echo "无折扣: " . $calculator->calculate(100) . "\n";
$calculator->setStrategy(new PercentageDiscount(20));
echo "20%折扣: " . $calculator->calculate(100) . "\n";
$calculator->setStrategy(new FixedDiscount(30));
echo "固定减30: " . $calculator->calculate(100) . "\n";
接口编程的核心优势
- 解耦:模块间通过接口通信,降低耦合度
- 扩展性:新增功能只需实现接口,无需修改现有代码
- 可测试性:可以轻松创建mock对象进行测试
- 多态性:同一接口可以有多种实现
- 依赖注入:通过接口依赖注入,便于管理
最佳实践
<?php
// 接口定义规范
interface RepositoryInterface {
public function find($id);
public function save(array $data);
public function delete($id);
}
// 使用依赖注入容器
class Container {
private $bindings = [];
public function bind($abstract, $concrete) {
$this->bindings[$abstract] = $concrete;
}
public function make($abstract) {
if (isset($this->bindings[$abstract])) {
$resolver = $this->bindings[$abstract];
return $resolver();
}
throw new Exception("绑定不存在");
}
}
// 使用示例
$container = new Container();
$container->bind(PaymentInterface::class, function() {
return new AlipayPayment(['app_id' => 'test', 'private_key' => 'key']);
});
$payment = $container->make(PaymentInterface::class);
面向接口编程是现代PHP架构的核心思想之一,它让代码更加灵活、可维护、可测试,通过合理使用接口,你可以构建出健壮且易于扩展的应用系统。