php7魔术方法__call的最佳实战之数据库PDO类的驱动设计实战
发布时间:2023-12-20 21:35:27 所属栏目:PHP 来源:DaWei
导读: 目录概述
这是关于php进阶到架构之php7核心技术与最佳实战学习的第四篇文章:php7魔术方法__call的最佳实战之数据库PDO类的驱动设计实战
数据库PDO驱动设计结构图
PHP数据库_php g
这是关于php进阶到架构之php7核心技术与最佳实战学习的第四篇文章:php7魔术方法__call的最佳实战之数据库PDO类的驱动设计实战
数据库PDO驱动设计结构图
PHP数据库_php g
目录概述 这是关于php进阶到架构之php7核心技术与最佳实战学习的第四篇文章:php7魔术方法__call的最佳实战之数据库PDO类的驱动设计实战 数据库PDO驱动设计结构图 PHP数据库_php gd库设置图片格式_删库跑路 php 数据库PDO驱动设计结构图 数据库PDO驱动设计代码实战 第一步:实现数据库实现类Mysql,Oracle,和Sqlite 代码如下: class Mysql{ public function select($sql){ return 'Mysql'.$sql;//模拟数据库查询 } } class Oracle{ public function select($sql){ return 'Oracle'.$sql;//模拟数据库查询 } } class Sqlite{ public function select($sql){ return 'Sqlite'.$sql;//模拟数据库查询 } } 第二步:实现数据库的驱动类 $驱动类->select(); 驱动类并没有 select 方法,所以触发驱动类 __call() 调用, 然后在__call方法实现对应类调用->select() 驱动类代码实现: class DbDriver{ private $dbClassName;//数据库类名 public function __construct($dbClassName) { //保存数据库类名 $this->dbClassName = $dbClassName; } /** * $驱动类->select($sql),驱动类DbDriver没有select方法,调用__call方法 * @param $name * @param $arguments */ public function __call($name, $arguments) { $dbClassName = $this->dbClassName;//类名 $dbClassObj = new $dbClassName ();//创建类对象 $functionName = $name; //暂不考虑数据类不存在的方法判断 // if(!method_exists($dbClass,$functionName)){ // return false;//未定义该方法 // } return $dbClassObj->$functionName($arguments[0]);//目前select方法只有一个参数 } } PDO代码运行实例: $dbDriver = new DbDriver('Mysql'); $result = $dbDriver->select(''); echo $result;//输出mysql $dbDriver = new DbDriver('Oracle'); $result2 = $dbDriver->select(''); echo $result2;//输出Oracle $dbDriver = new DbDriver('Sqlite'); $result3 = $dbDriver->select(''); echo $result3;//输出Sqlite 如果日后更换了数据驱动, 只需将$dbDriver = new DbDriver('Mysql'); 换成$dbDriver = new DbDriver('Sqlite'); 就可以了PHP数据库,代码无需做其他改动。 数据库PDO驱动设计完整代码 //数据类实现 class Mysql{ public function select($sql){ return 'Mysql'.$sql;//模拟数据库查询 } } class Oracle{ public function select($sql){ return 'Oracle'.$sql;//模拟数据库查询 } } class Sqlite{ public function select($sql){ return 'Sqlite'.$sql;//模拟数据库查询 } } //PDO驱动类实现 class DbDriver{ private $dbClassName;//数据库类名 public function __construct($dbClassName) { //保存数据库类名 $this->dbClassName = $dbClassName; } /** * $驱动类->select($sql),驱动类DbDriver没有select方法,调用__call方法 * @param $name * @param $arguments */ public function __call($name, $arguments) { $dbClassName = $this->dbClassName;//类名 $dbClassObj = new $dbClassName ();//创建类对象 $functionName = $name; //暂不考虑数据类不存在的方法判断 // if(!method_exists($dbClass,$functionName)){ // return false;//未定义该方法 // } return $dbClassObj->$functionName($arguments[0]);//目前select方法只有一个参数 } } //驱动类调用Mysql类 $dbDriver = new DbDriver('Mysql'); $result = $dbDriver->select(''); echo $result;//输出mysql //驱动类调用Oracle类 $dbDriver = new DbDriver('Oracle'); $result2 = $dbDriver->select(''); echo $result2;//输出Oracle //驱动类调用Sqlite类 $dbDriver = new DbDriver('Sqlite'); $result3 = $dbDriver->select(''); echo $result3;//输出Sqlite (编辑:甘南站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐