PHP.23-ThinkPHP框架的三种模型实例化-(D()方法与M()方法的区别)

三种模型实例化

原则上:每个数据表应对应一个模型类(Home/Model/GoodsModel.class.php -->  表tp_goods)

1、直接实例化

  和实例化其他类库一样实例化模型类,通过路径进行实例化

$User = new HomeModelUserModel();
$Info = new AdminModelInfoModel();
// 带参数实例化
$New  = new HomeModelNewModel('blog','think_',$connection);  //第一个参数为模型名【模型的名称 和数据表前缀一起配合用于自动识别数据表名称】,第二个是表前缀,第三个是连接信息(大部分情况下不需要这些参数也可实例化)

2、用D方法实例化

  设自定义模型HomeModelUserModel类存在

  HomeControllerUserController.class.php中实例化

<?php
    //实例化模型
    $User = D('User');
    // 相当于 $User = new HomeModelUserModel();
    // 执行具体的数据操作  可以是模型类中自定义的数据操作方法
    $User->select();

                     D方法的参数就是模型的名称,并且和模型类的大小写定义是一致的,例如:

参数实例化的模型文件(假设当前模块为Home)
User 对应的模型类文件的 HomeModelUserModel.class.php
UserType 对应的模型类文件的 HomeModelUserTypeModel.class.php

  D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会实例化系统的ThinkModel基类,同时对于已实例化过的模型,不会重复去实例化。

D方法还可以支持跨模块调用,需要使用:
    //实例化Admin模块的User模型
    D('Admin/User');
    //实例化Extend扩展命名空间下的Info模型
    D('Extend://Editor/Info');

  注意:跨模块实例化模型类的时候 不支持自动加载公共模块的模型类

3、用M方法实例化

  D方法实例化模型类的时候通常是实例化某个具体的模型类,如果你仅仅是对数据表进行基本的CURD操作的话,使用M方法实例化的话,由于不需要加载具体的模型类,性能会更高

// 使用M方法实例化
    $User = M('User');        //此时实例化的是数据表tp_user,而不一定会有对应的模型类UserModel.class.php
// 和用法 $User = new ThinkModel('User'); 等效
// 执行其他的数据操作
    $User->select();

  如果你仅仅是使用原生SQL查询的话,不需要使用额外的模型类,实例化一个空模型类即可进行操作了

//实例化空模型
    $Model = new Model();
//或者使用M快捷方法是等效的$Model = M();
//进行原生的SQL查询
    $Model->query('SELECT * FROM think_user WHERE status = 1');

注:D方法和M方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法

原文地址:https://www.cnblogs.com/zixuanfy/p/6772719.html