• ThinkPHP3.2.3 M函数和D函数的区别


    1.直接实例化:

    下面的代码是:/Think/Model中的构造函数,即Think命名空间下的Model类。

    三个参数:模型名+表前缀+数据库连接信息

    模型名+表前缀:配合一起使用,用于自动识别数据表的名称。

    数据库连接信息:当前数据表的数据库连接信息。有三种定义方式:字符串定义,数组定义,配置定义。

    表前缀为NULL,转换为‘’,在使用配置文件中的表前缀;非‘’,就使用当前的表前缀。

    例如:$User = new HomeModelUserModel(); 实例化HomeModel命名空间下的UserModel类  =>对应的表名为  think_user   

       $New = new HomeModelNewModel(‘New’,'ln_',$connection); 实例化HomeModel命名空间下的NewModell类  =>识别的表名为  ln_new

         $New = new HomeModelNewModel(‘User’,'ln_',$connection); 实例化HomeModel命名空间下的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函数实例化参数与直接实例化相同。默认是用来实例化ThinkModel下的模型类文件的。

    当然也可以实例化其他的公共模型类,例如:

    $User = M('HomeModelCommonModel:User','ln_',$connection);

    相当于$User = new HomeModelCommonModel('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 ThinkModel();

           $User = D('User');  相当于  $User = new HomeModelUserModel();  使用默认的模块(DEFAULT_MODULE)

           $User = D('User','Model_1');  相当于  $User = new HomeModel_1UserModel();  

      注意:上述实例化的前提是,默认模块(DEFAULT_MODULE)Home中的模型层中有相应的模型类文件。当默认模块的模型层中不存在该模型类文件,D函数会尝试实例化

    公共模块(Common)下的模型层中的模型类文件。对于上述例子中的第二项:不存在,则$User = new CommonModelUserModel();

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

    实例化。

      3)支持跨模块实例化:跨模块实例化模型类时,不支持自动加载公共模块的模型类。

      例如:D('Admin/User'); 实例化Admin模块中的Model中的UserModel模型类

           D('Extend://Editor/Info); 实例化Extend扩展明明空间下的InfoModel模型类

    function D($name='',$layer='') {
        if(empty($name)) return new ThinkModel;
        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_MODULEDEFAULT_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 ThinkModel($name);
        }else {
            ThinkLog::record('D方法实例化没找到模型类'.$class,ThinkLog::NOTICE);
            $model      =   new ThinkModel(basename($name));
        }
        $_model[$name.$layer]  =  $model;
        return $model;
    }
  • 相关阅读:
    准备 FRM 考试——方法、工具与教训
    930. 和相同的二元子数组 前缀和
    1906. 查询差绝对值的最小值 前缀和
    剑指 Offer 37. 序列化二叉树 二叉树 字符串
    815. 公交路线 BFS
    518. 零钱兑换 II dp 完全背包
    1049. 最后一块石头的重量 II dp
    5779. 装包裹的最小浪费空间 二分
    5778. 使二进制字符串字符交替的最少反转次数 字符串 滑动窗口
    474. 一和零 dp
  • 原文地址:https://www.cnblogs.com/laining/p/7455033.html
Copyright © 2020-2023  润新知