主页 > MySQL > CI中DB对象剖析

CI中DB对象剖析

2011 年 07 月 08 日 没有评论

CI中使用DB类,只要你在你的控制器中使用了这句话:$this->load->database();那么你就可以在你的控制器中的任何地方或者是在模型的任何地方都可以使用$this->db->function()来操作数据库了。那么CI 是怎么样做到这一步的呢?下面一一道来:
首先,我做过测试,在$this->load->database()这句话之前你要是打印$this->db的话,是没有任何数据的,但是在这句话之后打印的话,那么会出现很多对象属性啊方法等信息。那么首先来看下Loader.php文件中的database方法:
该方法的主要功能有:1、通过get_instance()来获得一个CI对象,2、加载数据库初始化类文件database/DB.php,将初始化后的对象放置到$CI->db中,这样子,整个CI对象中就有了db对象了。在任何一个能获取CI对象的地方都可以使用db对象了。那么问题是:这个db对象到底是怎么了的呢?继续往下:
看下文件DB.php文件,里面就只有一个方法DB。这个方法的主要功能有:
1、加载config文件夹下面的数据库配置文件:config/database.php
2、判断当前选择的数据库,默认为$active_group = ‘default’
3、加载数据库驱动类文件/database/DB_driver.php
4、判断是否启动了Active Record 模式,如果是,那么就加载database/DB_active_rev.php文件,否则,不加载
5、判断类CI_DB是否存在,如果不存在,那么在AR模式下:class CI_DB extends CI_DB_active_record{};否则class CI_DB extends CI_DB_driver{}
6、加载指定数据库的驱动文件 如mysql的是:database/driver/mysql_driver.php
7、实例化database/driver/mysql_driver.php文件中类CI_DB_mysql_driver,这个实例化出来的对象就是我们平时用到的对象了。

类CI_DB_mysql_driver继承了CI_DB类,,然后CI_DB类 继承了CI_DB_active_record类,CI_DB_active_record类继承了CI_DB_driver类,
类CI_DB_driver是数据库的基类,
上面的继承都是在AR模式下面的
如果没有开启AR模式,那么继承方式是一样的;如下:
类CI_DB_mysql_driver继承了CI_DB类,,然后CI_DB类直接继承了CI_DB_driver类。
整个数据库的流程大致就是这样子。
//PS:
为什么我们在控制器和模型中都可以使用$this->db来操作数据库对象呢?
刚刚上面我们说了在控制器中的使用原理,那么在模型中为什么可以使用呢?
其实模型中的$this->db是完全靠控制器中的对象来实现的,主要是:
1、通过get_instance()来获取CI对象,
2、通过__get方法来获取db这个私有属性的值

function __get($key){
      return $CI->$key;
}

Tags: CI

发表评论

电子邮件地址不会被公开。 必填项已用*标注


*

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>