模型类都要继承模型基类Model.class.php
根据注释描述,该模型基类实现了ORM和ActiveRecords模式:实现了表映射到类,记录映射到对象。
构造函数:获取模型名称->获取表前缀->数据库初始化
/** * 架构函数 * 取得DB类的实例对象 字段检查 * @access public * @param string $name 模型名称 * @param string $tablePrefix 表前缀 * @param mixed $connection 数据库连接信息 */ public function __construct($name='',$tablePrefix='',$connection='') { // 模型初始化 $this->_initialize(); // 获取模型名称 当$name不为空,可直接获取模型名字,为空时通过getModelName()获取 if(!empty($name)) { if(strpos($name,'.')) { // 支持 数据库名.模型名的 定义 list($this->dbName,$this->name) = explode('.',$name); }else{ $this->name = $name; } }elseif(empty($this->name)){ $this->name = $this->getModelName(); } // 设置表前缀 if(is_null($tablePrefix)) {// 前缀为Null表示没有前缀 $this->tablePrefix = ''; }elseif('' != $tablePrefix) { $this->tablePrefix = $tablePrefix; }elseif(!isset($this->tablePrefix)){ $this->tablePrefix = C('DB_PREFIX'); //该参数在Application/Common下的配置文件中设置 } // 数据库初始化操作 // 获取数据库操作对象 // 当前模型有独立的数据库连接信息 $this->db(0,empty($this->connection)?$connection:$this->connection,true); }
所以在构造函数中,主要调用了两个函数,一个是获取模型名字(模型名字为空时),一个是数据库初始化操作。
模型名字为空时,获取模型名:根据当前执行的模型类获取模型名。
public function getModelName() { if(empty($this->name)){ $name = substr(get_class($this),0,-strlen(C('DEFAULT_M_LAYER')));//根据thinkPHP命名规则,模型类的名字为:模型名+Model.class.php //所以,为了获取模型名,去掉“Model” if ( $pos = strrpos($name,'\\') ) {//有命名空间 $this->name = substr($name,$pos+1); }else{ $this->name = $name; } } return $this->name; }
数据库初始化操作:根据参数新建数据库实例
/** * 切换当前的数据库连接 * @access public * @param integer $linkNum 连接序号 * @param mixed $config 数据库连接信息 * @param boolean $force 强制重新连接 * @return Model */ public function db($linkNum='',$config='',$force=false) { if('' === $linkNum && $this->db) { return $this->db; } if(!isset($this->_db[$linkNum]) || $force ) { // 创建一个新的实例 if(!empty($config) && is_string($config) && false === strpos($config,'/')) { // 支持读取配置参数 $config = C($config); } $this->_db[$linkNum] = Db::getInstance($config); //取得数据库类实例,返回数据库驱动类 }elseif(NULL === $config){ $this->_db[$linkNum]->close(); // 关闭数据库连接 unset($this->_db[$linkNum]); return ; } // 切换数据库连接 $this->db = $this->_db[$linkNum]; $this->_after_db(); // 字段检测 if(!empty($this->name) && $this->autoCheckFields) $this->_checkTableInfo(); return $this; }
该函数调用了三个函数,Db::getInstance($config),取得数据库实例,返回数据库驱动类
$this->_after_db(),目前该函数为空
$this->_checkTableInfo(),自动检测数据表信息
这个类里面实现的功能实在是太多了,增删查改,保存数据,字段映射等等等等。再看吧。