前言:
目前我们对“pdophp开启”大致比较关心,小伙伴们都想要分析一些“pdophp开启”的相关文章。那么小编在网络上搜集了一些对于“pdophp开启””的相关内容,希望咱们能喜欢,我们快快来学习一下吧!目录概述数据库PDO驱动设计结构图数据库PDO驱动设计代码实战数据库PDO驱动设计完整代码php7进阶到架构师相关阅读概述
这是关于php进阶到架构之php7核心技术与最佳实战学习的第四篇文章:php7魔术方法__call的最佳实战之数据库PDO类的驱动设计实战
第一篇:用房子的思维秒懂php7传值与传引用的区别第二篇: php7语法糖好甜,让你迷上php魔术方法第三篇:php7魔术方法__call的最佳实战之链式操作实现第四篇:php7魔术方法__call的最佳实战之数据库PDO类的驱动设计实战
数据库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');
就可以了,代码无需做其他改动。
数据库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;//输出Sqlitephp7进阶到架构师相关阅读
最后,欢迎大家留言补充,讨论~~~
标签: #pdophp开启