tp5数据库连接源码分析

今天研究了一下tp5的数据库连接的源码部分。仅限于数据库连接,后期我会再着重分析一下数据库查询的源码。

我们在使用tp5操作数据库的时候,基本上都是通过Db类实现的。或者是使用db()函数。其实db()函数也是通过Db类实现的。那么在tp5中连接数据库都涉及到了哪些文件呢?

think\Db
think\db\connector\Mysql (我们经常用到的就是mysql数据库,所以就以mysql为例来讲)
think\db\Connection (上面mysql类的父类,连接器)
think\db\Query (查询器)

假设数据库的文件已经配置好,我们需要查询edu_olatform数据库中lesson表中的数据。需要进行如下图所示的操作

db()方法就是helper.php中封装好的方法。

Db类中的connect方法

现在得到了一个Mysql的实例化对象,并且要调用它的name方法。在Mysql类中查找name方法是没有的,发现mysql类继承db\Connector.php,在Connector.php查找也没有。因为我们得到的是一个mysql实例化的对象,如果它调用了不存在的方法,那么就执行魔术方法__call()

$method 是 name

$args 是 lesson字符串

call_user_func_array函数的作用是调用回调函数,并把一个数组参数作为回调函数的参数,那么name就相当于回调函数,lesson就是所传的参数。整个代码的含义就是执行,返回一个Query对象。获取到这个对象就说明连接成功了。

$this->getQuery()为以下代码,作用是return一个Query类的实例化对象。

我们看一下call_user_func_array函数中第一个参数是一个数组。根据php官网对call_user_func_array的解释https://www.php.net/manual/zh/function.call-user-func-array.php

就是调用Query实例化对象的name方法,而$args就是name方法的参数。作用就是制定数据表名lesson。

看到query对象中有一个name属性说明数据库连接成功了。