ThinkPHP的D函数十分强大,一般情况下用D方法最多的情况是实例化自定义模型类,实现数据库相关的操作,但是D方法的功能远远不仅于此,D方法还可用于逻辑层,服务层自定义类的实例化。
调用格式如下:
D('[项目://][分组/]模型','模型层名称')
关于D方法的一般用法本文不再描述,就是常见的D(‘User’)实例化Model下面的UserModel.class.php。
我们在LIB_PATH,也就是和Controller(以前版本叫Action),Model文件夹同级的目录建立Logic或者Service文件夹。
ThinkPHP分层模型逻辑层
在Logic文件夹中新建文件UserLogic.class.php,作为用户逻辑业务的一个类,那么实例化这个类的时候,可以用tp自带的D方法,如下:
D('User','Logic');
这样就调用Logic文件夹下的UserLogic.class.php文件并实例化class UserLogic,专业一点的说法是D方法支持分成模型并实例化自定义类。这里的分层模型指的就是Logic和Service这样的目录。
注:分层模型从ThinkPHP 3.1版本开始支持。
我们来看看ThinkPHP D方法的源码:
/**
* D函数用于实例化模型类 格式 [资源://][模块/]模型
* @param string $name 资源地址
* @param string $layer 模型层名称
* @return Model
*/
function D($name='',$layer='') {
if(empty($name)) return new ThinkModel;
static $_model = array();
$layer = $layer? $layer : C('DEFAULT_M_LAYER');
if(isset($_model[$name.$layer]))
return $_model[$name.$layer];
$class = parse_res_name($name,$layer);
if(class_exists($class)) {
$model = new $class(basename($name));
}elseif(false === strpos($name,'/')){
// 自动加载公共模块下面的模型
$class = '\Common\'.$layer.'\'.$name.$layer;
$model = class_exists($class)? new $class($name) : new ThinkModel($name);
}else {
ThinkLog::record('D方法实例化没找到模型类'.$class,ThinkLog::NOTICE);
$model = new ThinkModel(basename($name));
}
$_model[$name.$layer] = $model;
return $model;
}
当然,我们也可以重新写个调用分层模型中自定义类的方法,如:
/**
* 业务逻辑层调用函数
* @param string $name 业务模型名称
* @return object
*/
function logic($name){
static $_obj=array();
$layer='Logic';
$class=$name.$layer;
if(isset($_obj[$name])){
return $_obj[$name];
}
require LIB_PATH."{$layer}/".$class.'.class.php';
$_obj[$name] = new $class($name);
return $_obj[$name];
}
写到tp公共函数中,以后调用Logic分层模型(实际上就是这个文件夹)下的自定义类就可以直接这样用:Logic(‘User’)就ok了。