您的位置 首页 php

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

目录

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

概述

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

  • 第一篇:用房子的思维秒懂php7传值与传引用的区别
  • 第二篇: php7语法糖好甜,让你迷上php魔术方法
  • 第三篇:
  • 第四篇: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;//模拟数据库查询
    }
}  

第二步:实现数据库的驱动类

驱动类代码实现:

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

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

文章来源:智云一二三科技

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

文章地址:https://www.zhihuclub.com/149025.shtml

关于作者: 智云科技

热门文章

网站地图