目录
- 概述
- 数据库PDO驱动设计结构图
- 数据库PDO驱动设计代码实战
- 数据库PDO驱动设计完整代码
- php7进阶到架构师相关阅读
概述
这是关于php进阶到架构之 php7核心技术与最佳实战 学习的第 四 篇文章:php7魔术方法__call的最佳实战之数据库PDO类的驱动设计实战
- 第一篇:用房子的思维秒懂php7传值与传引用的区别
- 第二篇: php7语法糖好甜,让你迷上php魔术方法
- 第三篇:
- 第四篇: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;//模拟数据库查询
}
}
第二步:实现数据库的驱动类
驱动类代码实现:
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;//输出Sqlite