龙空技术网

php7魔术方法__call的最佳实战之数据库PDO类的驱动设计实战

军有一言 178

前言:

目前我们对“pdophp开启”大致比较关心,小伙伴们都想要分析一些“pdophp开启”的相关文章。那么小编在网络上搜集了一些对于“pdophp开启””的相关内容,希望咱们能喜欢,我们快快来学习一下吧!

目录概述数据库PDO驱动设计结构图数据库PDO驱动设计代码实战数据库PDO驱动设计完整代码php7进阶到架构师相关阅读概述

这是关于php进阶到架构之php7核心技术与最佳实战学习的第四篇文章:php7魔术方法__call的最佳实战之数据库PDO类的驱动设计实战

第一篇:用房子的思维秒懂php7传值与传引用的区别第二篇: php7语法糖好甜,让你迷上php魔术方法第三篇:php7魔术方法__call的最佳实战之链式操作实现第四篇: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');

就可以了,代码无需做其他改动。

数据库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
php7进阶到架构师相关阅读

最后,欢迎大家留言补充,讨论~~~

标签: #pdophp开启