您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

ThinkPHP 的 D 和 M 有什么分别?

2024/3/1 7:58:24发布21次查看
回复内容: 你可以参考我的视频。。。m是使用系统自带的model,不需要自定义模型,而d的话,需要自定义模型。 m是快速实例化模型,不需要你有相应的model类文件,d是必须要创建一个model类才能实例化 根据不同的模型定义,我们有几种实例化模型的方法,下面来分析下什么情况下用什么方法:
1、实例化基础模型(model) 类
在没有定义任何模型的时候,我们可以使用下面的方法实例化一个模型类来进行操作:
$user = new model('user');
或者使用m快捷方法实例化是等效的
$user = m('user');
$user->select(); // 进行其他的数据操作
这种方法最简单高效,因为不需要定义任何的模型类,所以支持跨项目调用。缺点也是因为没有自定义的模型类,因此无法写入相关的业务逻辑,只能完成基本的curd操作。
2、实例化其他模型类
第一种方式实例化因为没有模型类的定义,因此很难封装一些额外的逻辑方法,不过大多数情况下,也许只是需要扩展一些通用的逻辑,那么就可以尝试下面一种方法。
m方法默认是实例化model类,如果需要实例化其他模型类,可以使用
$user = m('user', 'commonmodel');
上面的方法等效于
$user = new commonmodel('user');
因为系统的模型类都能够自动加载,因此我们不需要在实例化之前手动进行类库导入操作。模型类commonmodel必须继承model,如果没有定义别名导入的话,需要放在项目model下。我们可以在commonmodel类里面定义一些通用的逻辑方法,就可以省去为每个数据表定义具体的模型类,如果你的项目已经有超过100个数据表了,而大多数情况都是一些基本的curd操作的话,只是个别模型有一些复杂的业务逻辑需要封装,那么第一种方式和第二种方式的结合是一个不错的选择。
3、实例化用户定义的模型(×××model)类
这种情况是使用的最多的,一个项目不可避免的需要定义自身的业务逻辑实现,就需要针对每个数据表定义一个模型类,例如usermodel 、infomodel等等。
定义的模型类通常都是放到项目的lib\model目录下面。例如,
class usermodel extends model{
public function myfun(){
// 添加自己的业务逻辑
// ………
}
}
其实模型类还可以继承一个用户自定义的公共模型类,而不是只能继承model类。
要实例化自定义模型类,可以使用下面的方式:
$user = new usermodel();
或者使用d快捷方法实例化是等效的
$user = d('user');
$user->select(); // 进行其他的数据操作
d方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会实例化model基类,同时对于已实例化过的模型,不会重复去实例化。默认的d方法只能支持调用当前项目的模型,如果需要跨项目调用,需要使用:
$user = d('user', 'admin'); // 实例化admin项目下面的user模型
$user->select();
如果启用了模块分组功能,可使用:
$user = d('admin.user');
4、实例化空模型类
如果你仅仅是使用原生sql查询的话,不需要使用额外的模型类,实例化一个空模型类即可进行操作了,例如:
$model = new model();
// 或者使用m快捷方法实例化是等效的
// $model = m();
$model->query('select * from think_user where status=1');
空模型类也支持跨项目调用。
d函数必须有model文件存在,m不需要,仅仅是生成了一个最基础的可以对数据库表操作的model对象。 简单粗暴的理解方式是:m是直接实例化某个表,d是挂载某个模型
php进阶qq群欢迎加入474370592m方法是对model的封装相对简单不灵活。d是调用对应模块基础上的生成,更加灵活。比如修改调用表名,调用不同模块下的方法都可以使用d方法。
另外你可以在d方法所调用的的模型中,改写原有方法的构造函数,还有设置其他方法,比如映射方法。也是需要在其中进行设置的。比如可以通过在d方法调用了数据表格之后,在对应model模块下的类文件中进行细节化的设置。
protected $_scope=array();可以用来设置select检索的条件
protected $_validate=array();可以用来创建对提交到数据库之前数据的验证规则。
这样d方法就相对m方法更加的灵活,代码也更变便于阅读,有关数据操作部分就在c部分执行,而有关的数据验证,检索条件等方面就在m方面进行。 d不一定要有相应的model类,可以实例化一个空d d方法初始化的对象包含类的方法,而m方法只是初始化的对象只包含thinkphp内部定义的数据库模型操作方法。可以简单的说:d适用于抽象类的初始化,而m是原始的orm。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product