加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2023-01-14 09:01:14 所属栏目:PHP教程 来源:网络
导读: 目录概述
这是关于php进阶到架构之php7核心技术与最佳实战学习的第四篇文章:php7魔术方法__call的最佳实战之数据库PDO类的驱动设计实战
数据库PDO驱动设计结构图

数据库PDO驱动设计结构图

目录概述

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

数据库PDO驱动设计结构图

PHP数据库_php gd库设置图片格式_删库跑路 php

数据库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

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!