目录概述
这是关于php进阶到架构之php7核心技术与最佳实战学习的第四篇文章:php7魔术方法__call的最佳实战之数据库PDO类的驱动设计实战
数据库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');
就可以了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
(编辑:威海站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|