PHP面向接口编程实例

wen PHP项目 2

本文目录导读:

PHP面向接口编程实例

  1. 完整实例:支付系统
  2. 接口编程的核心优势
  3. 最佳实践

我来通过一个具体实例演示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";

接口编程的核心优势

  1. 解耦:模块间通过接口通信,降低耦合度
  2. 扩展性:新增功能只需实现接口,无需修改现有代码
  3. 可测试性:可以轻松创建mock对象进行测试
  4. 多态性:同一接口可以有多种实现
  5. 依赖注入:通过接口依赖注入,便于管理

最佳实践

<?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架构的核心思想之一,它让代码更加灵活、可维护、可测试,通过合理使用接口,你可以构建出健壮且易于扩展的应用系统。

抱歉,评论功能暂时关闭!