0

0

PHP架构里适配器模式怎么用_实例讲解【说明】

蓮花仙者

蓮花仙者

发布时间:2025-12-31 16:52:02

|

967人浏览过

|

来源于php中文网

原创

适配器模式解决接口不兼容问题,使AlipaySdk、WechatPayV3、StripeClient等第三方支付SDK能被同一套业务逻辑统一调用,通过定义PayInterface并为各SDK编写仅做参数转换、异常映射和返回值标准化的适配器实现。

php架构里适配器模式怎么用_实例讲解【说明】

适配器模式解决什么问题

当你的 PHP 项目要对接多个第三方支付 SDK(比如 AlipaySdkWechatPayV3StripeClient),但它们的接口不统一——有的用 pay($order),有的叫 createPayment($data),还有的返回数组而另一个抛异常——这时直接写 if-else 调用会迅速失控。适配器模式不是为了“增强功能”,而是让这些不兼容的类“能被同一套业务逻辑调用”。

怎么写一个支付适配器

核心是定义统一接口,再为每个 SDK 写一个实现该接口的包装类。不要修改原 SDK 源码,也不继承它(除非 SDK 明确支持继承且无副作用)。

常见错误:把适配器写成工厂或门面;或者在适配器里加业务逻辑(比如自动重试、日志埋点),这会让适配器偏离单一职责。

  • 统一接口必须只声明业务需要的操作,例如:PayInterface::pay()PayInterface::query()
  • 每个适配器构造函数接收对应 SDK 的实例(依赖注入),而不是在内部 new 它
  • 适配器里只做参数转换、异常映射、返回值标准化,不处理订单状态机或金额校验
interface PayInterface
{
    public function pay(array $order): array;
    public function query(string $tradeNo): array;
}

class AlipayAdapter implements PayInterface
{
    private $sdk;

    public function __construct(\Alipay\AopClient $sdk)
    {
        $this->sdk = $sdk;
    }

    public function pay(array $order): array
    {
        $request = new \Alipay\Request\AlipayTradePagePayRequest();
        $request->setBizContent(json_encode([
            'out_trade_no' => $order['id'],
            'total_amount' => $order['amount'],
            'subject' => $order['title'],
        ]));
        $result = $this->sdk->execute($request);
        // 把支付宝的 stdClass / array / 异常转成统一 array 结构
        return [
            'success' => !empty($result->body),
            'redirect_url' => $result->body ?? '',
            'raw' => $result,
        ];
    }

    public function query(string $tradeNo): array
    {
        // 实现类似逻辑...
        return ['status' => 'paid'];
    }
}

什么时候不该用适配器

如果两个类差异极小(比如只是方法名大小写不同),或你只对接一个 SDK 且确定长期不会换,硬套适配器反而增加维护成本。适配器的价值出现在“变化点”上——SDK 替换、协议升级、多渠道并存。

立即学习PHP免费学习笔记(深入)”;

Amazon Nova
Amazon Nova

亚马逊云科技(AWS)推出的一系列生成式AI基础模型

下载

容易踩的坑:

  • 在适配器里调用 $sdk->init() 或连接池管理——这属于基础设施层,应由 DI 容器或工厂负责
  • 适配器返回对象类型不一致(比如有时返回 stdClass,有时返回 ArrayObject),导致下游代码反复 is_object() 判断
  • 把 HTTP 客户端(如 Guzzle)也塞进适配器——它应该作为依赖传入,而不是在适配器里 new

和策略模式的区别在哪

适配器解决的是“接口不兼容”,策略解决的是“算法可替换”。你不会用适配器来切换「微信扫码」和「微信公众号」支付方式——它们本就是同一 SDK 下的不同调用路径,该用策略;但当你把微信支付 SDK 和 Stripe SDK 并列支持时,就必须先用适配器抹平接口差异,再用策略选具体实现。

真实项目里,二者常嵌套使用:策略上下文持有一个 PayInterface,运行时根据渠道配置决定 new 哪个适配器实例。

最易被忽略的一点:适配器的测试不能只测 happy path。必须覆盖原 SDK 抛出的各类异常(网络超时、签名失败、无效参数),并在适配器中映射为统一的 PayException 或错误码字段——否则业务层无法稳定降级。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1969

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

658

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2405

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

47

2026.01.19

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

502

2023.08.14

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

498

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

453

2023.11.14

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.6万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号