1.直接实例化:
下面的代码是:/Think/Model中的构造函数,即Think命名空间下的Model类。
三个参数:模型名+表前缀+数据库连接信息
模型名+表前缀:配合一起使用,用于自动识别数据表的名称。
数据库连接信息:当前数据表的数据库连接信息。有三种定义方式:字符串定义,数组定义,配置定义。
表前缀为NULL,转换为‘’,在使用配置文件中的表前缀;非‘’,就使用当前的表前缀。
例如:$User = new \Home\Model\UserModel(); 实例化Home\Model命名空间下的UserModel类 =>对应的表名为 think_user
$New = new \Home\Model\NewModel(‘New’,‘ln_‘,$connection); 实例化Home\Model命名空间下的NewModell类 =>识别的表名为 ln_new
$New = new \Home\Model\NewModel(‘User’,‘ln_‘,$connection); 实例化Home\Model命名空间下的NewModell类 =>识别的表名为 ln_user
注意:类的命名空间地址与所在的路径地址保持一致。
public function __construct($name=‘‘,$tablePrefix=‘‘,$connection=‘‘) { ???????// 模型初始化 ???????$this->_initialize(); ???????// 获取模型名称,模型名称有两种形式:一种为:模型名;另一种为数据库名.模型名 ???????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‘); ???????} ???????// 数据库初始化操作 ???????// 获取数据库操作对象 ???????// 当前模型有独立的数据库连接信息 ???????$this->db(0,empty($this->connection)?$connection:$this->connection,true); ???}
2.M函数实例化
M函数实例化参数与直接实例化相同。默认是用来实例化\Think\Model下的模型类文件的。
当然也可以实例化其他的公共模型类,例如:
$User = M(‘\Home\Model\CommonModel:User‘,‘ln_‘,$connection);
相当于$User = new \Home\Model\CommonModel(‘User‘,‘ln_‘,$connection); CommonModel模型类对应的的表名为ln_user。
function M($name=‘‘, $tablePrefix=‘‘,$connection=‘‘) { ???static $_model ?= array(); ???if(strpos($name,‘:‘)) { ???????list($class,$name) ???= ?explode(‘:‘,$name); ???}else{ ???????$class ?????= ??‘Think\\Model‘; ???} ???$guid ??????????= ??(is_array($connection)?implode(‘‘,$connection):$connection).$tablePrefix . $name . ‘_‘ . $class; ???if (!isset($_model[$guid])) ???????$_model[$guid] = new $class($name,$tablePrefix,$connection); ???return $_model[$guid];}
3.D函数实例化:两个参数:模型名+模型层名
1)用于实例化自定义模型类。
例如:$User = D(); 相当于 $User = new \Think\Model();
$User = D(‘User‘); 相当于 $User = new \Home\Model\UserModel(); 使用默认的模块(DEFAULT_MODULE)
$User = D(‘User‘,‘Model_1‘); 相当于 $User = new \Home\Model_1\UserModel();
注意:上述实例化的前提是,默认模块(DEFAULT_MODULE)Home中的模型层中有相应的模型类文件。当默认模块的模型层中不存在该模型类文件,D函数会尝试实例化
公共模块(Common)下的模型层中的模型类文件。对于上述例子中的第二项:不存在,则$User = new \Common\Model\UserModel();
2)用于自动检测模型类。如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会实例化系统的\Think\Model基类,同时对于已实例化过的模型,不会重复去
实例化。
3)支持跨模块实例化:跨模块实例化模型类时,不支持自动加载公共模块的模型类。
例如:D(‘Admin/User‘); 实例化Admin模块中的Model中的UserModel模型类
D(‘Extend://Editor/Info); 实例化Extend扩展明明空间下的InfoModel模型类
function D($name=‘‘,$layer=‘‘) { ???if(empty($name)) return new Think\Model; ???static $_model ?= ??array(); ???$layer ?????????= ??$layer? : C(‘DEFAULT_M_LAYER‘); ???if(isset($_model[$name.$layer])) ???????return $_model[$name.$layer]; ???$class ?????????= ??parse_res_name($name,$layer);//返回:默认模块\默认模型层名 即DEFAULT_MODULE\DEFAULT_M_LAYER ???if(class_exists($class)) { ???????$model ?????= ??new $class(basename($name)); ???}elseif(false === strpos($name,‘/‘)){ ???????// 自动加载公共模块下面的模型 ???????if(!C(‘APP_USE_NAMESPACE‘)){ ???????????import(‘Common/‘.$layer.‘/‘.$class); ???????}else{ ???????????$class ?????= ??‘\\Common\\‘.$layer.‘\\‘.$name.$layer; ???????} ???????$model ?????= ??class_exists($class)? new $class($name) : new Think\Model($name); ???}else { ???????Think\Log::record(‘D方法实例化没找到模型类‘.$class,Think\Log::NOTICE); ???????$model ?????= ??new Think\Model(basename($name)); ???} ???$_model[$name.$layer] ?= ?$model; ???return $model;}
ThinkPHP3.2.3 ??M函数和D函数的区别
原文地址:http://www.cnblogs.com/laining/p/7455033.html