zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    嵌入式C程序基础与编程结构
    英特尔图形处理器第8代架构
    用servlet打内容到网页上
    servlet获取多个同名参数
    JAVA之复制数组
    用JAVA写一个简单的英文加密器
    Tomcat使用
    JAVA,字符串替换
    使用自己的域名解析博客园地址(CSDN也可以)
    错误笔记20181124
  • 原文地址:https://www.cnblogs.com/laining/p/7455033.html
Copyright © 2011-2022 走看看