在ThinkPHP中,可以无需进行任何模型定义。只有在需要封装单独的业务逻辑的时候,模型类才是必须被定义的,因此ThinkPHP在模型上有很多的灵活和方便性,让你无需因为表太多而烦恼。
根据不同的模型定义,我们有几种实例化模型的方法,根据需要采用不同的方式:
直接实例化可以和实例化其他类库一样实例化模型类,例如:
$User = new HomeModelUserModel();
$Info = new AdminModelInfoModel();
// 带参数实例化
$New = new HomeModelNewModel('blog','think_',$connection);模型类通常都是继承系统的ThinkModel类,该类的架构方法有三个参数,分别是:
Model(['模型名'],['数据表前缀'],['数据库连接信息']);三个参数都是可选的,大多数情况下,我们根本无需传入任何参数即可实例化。
| 参数 | 实例化的模型文件(假设当前模块为Home) |
|---|---|
| User | 对应的模型类文件的 HomeModelUserModel.class.php |
| UserType | 对应的模型类文件的 HomeModelUserTypeModel.class.php |
如果在Linux环境下面,一定要注意D方法实例化的时候的模型名称的大小写。
D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会实例化系统的ThinkModel基类,同时对于已实例化过的模型,不会重复去实例化。
D方法还可以支持跨模块调用,需要使用:
//实例化Admin模块的User模型
D('Admin/User');
//实例化Extend扩展命名空间下的Info模型
D('Extend://Editor/Info');M方法实例化模型注意:跨模块实例化模型类的时候 不支持自动加载公共模块的模型类。
D方法实例化模型类的时候通常是实例化某个具体的模型类,如果你仅仅是对数据表进行基本的CURD操作的话,使用M方法实例化的话,由于不需要加载具体的模型类,所以性能会更高。
例如:
// 使用M方法实例化
$User = M('User');
// 和用法 $User = new ThinkModel('User'); 等效
// 执行其他的数据操作
$User->select();M方法也可以支持跨库操作,例如:
// 使用M方法实例化 操作db_name数据库的ot_user表
$User = M('db_name.User','ot_');
// 执行其他的数据操作
$User->select();M方法的参数和ThinkModel类的参数是一样的,也就是说,我们也可以这样实例化:
$New = M('new','think_',$connection);
// 等效于 $New = new ThinkModel('new','think_',$connection);具体的参数含义可以参考前面的介绍。
M方法实例化的时候,默认情况下是直接实例化系统的ThinkModel类,如果我们希望实例化其他的公共模型类的话,可以使用如下方法:
$User = M('HomeModelCommonModel:User','think_','db_config');
// 相当于 $User = new HomeModelCommonModel('User','think_','db_config');实例化空模型类如果你的模型类有自己的业务逻辑,M方法是无法支持的,就算是你已经定义了具体的模型类,M方法实例化的时候是会直接忽略。
如果你仅仅是使用原生SQL查询的话,不需要使用额外的模型类,实例化一个空模型类即可进行操作了,例如:
//实例化空模型
$Model = new Model();
//或者使用M快捷方法是等效的
$Model = M();
//进行原生的SQL查询
$Model->query('SELECT * FROM think_user WHERe status = 1');实例化空模型类后还可以用table方法切换到具体的数据表进行操作
我们在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法。



