[PHP] 使用适配器模式处理数据库对象
适配器模式的定义:
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原来由于接口不兼容而不能一起工作的那此类可以一起工作
包括两种模式:
类适配器模式与对象适配器
类适配器:Adapter类与被适配类是继承关系
对象适配器:Adapter对象与被适配类对象是委托关系 , 委托关系就是通过构造函数或者方法传入被适配对象
PDOAdapter 继承 PDO类 , 扩展里面的方法 , 这就是类适配器模式
ArticleModel传入PDOAdapter 对象 , 扩展PDOAdapter 对象的方法 , 这就是对象适配器
<?php //类适配器 class PDOAdapter extends PDO{ private $dsn = null; private $username = null; private $password = null; private $timeout = 30; private $charset = "utf8"; private $options = array( PDO::ATTR_AUTOCOMMIT => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ); public function __construct($dsn, $username, $password, $timeout = null){ $this->dsn = $dsn; $this->username = $username; $this->password = $password; $this->timeout = intval($timeout); parent::__construct($dsn, $username, $password, $this->options); $this->exec("set names ".$this->charset); } public function execute($sql, $params = array()){ $stmt = $this->prepare($sql); $execStatus=$stmt->execute($params); return $execStatus; } public function getAll($sql, $params = array()){ $stmt = $this->prepare($sql); $stmt->execute($params); return $stmt->fetchAll(); } } //对象适配器,使用委派 class ArticleModel{ private $pdo=null; public function __construct($pdo){ $this->pdo=$pdo; } //委派调用PDOAdapter的getAll方法 public function getArticleList(){ $res=$this->pdo->getAll("select * from countries"); return $res; } } class Controller{ public function doAction(){ try { $pdo=new PDOAdapter("mysql:host=127.0.0.1;port=3306;dbname=phpfly","phpfly","phpfly"); $model=new ArticleModel($pdo); $res=$model->getArticleList(); var_dump($res); } catch (Exception $e) { var_dump($e->getMessage()); } } } $c=new Controller(); $c->doAction();
十年开发经验程序员,离职全心创业中,历时三年开发出的产品《唯一客服系统》
一款基于Golang+Vue开发的在线客服系统,软件著作权编号:2021SR1462600。一套可私有化部署的网站在线客服系统,编译后的二进制文件可直接使用无需搭开发环境,下载zip解压即可,仅依赖MySQL数据库,是一个开箱即用的全渠道在线客服系统,致力于帮助广大开发者/公司快速部署整合私有化客服功能。
开源地址:唯一客服(开源学习版)
官网地址:唯一客服官网
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2020-03-30 [MySQL] 有没有解决幻读问题
2020-03-30 [PHP] PDO 提供了三种不同的错误处理模式
2020-03-30 [Linux] 使用vmstat查看系统的负载情况
2020-03-30 [MySQL] innoDB引擎的主键与聚簇索引
2018-03-30 [日常] Go语言圣经-命令行参数
2018-03-30 [日常] Go语言圣经前言
2016-03-30 [android] 服务的生命周期(混合方式)