ThinkPHP3.2.3 M函數和D函數的區別


1.直接實例化:

下面的代碼是:/Think/Model中的構造函數,即Think命名空間下的Model類。

三個參數:模型名+表前綴+數據庫連接信息

模型名+表前綴:配合一起使用,用於自動識別數據表的名稱。

數據庫連接信息:當前數據表的數據庫連接信息。有三種定義方式:字符串定義,數組定義,配置定義。

表前綴為NULL,轉換為‘’,在使用配置文件中的表前綴;非‘’,就使用當前的表前綴。

例如:$User = new \Home\Model\UserModel(); 實例化Home\Model命名空間下的UserModel類  =>對應的表名為  think_user   

   $New = new \Home\Model\NewModel(‘New’,'ln_',$connection); 實例化Home\Model命名空間下的NewModell類  =>識別的表名為  ln_new

     $New = new \Home\Model\NewModel(‘User’,'ln_',$connection); 實例化Home\Model命名空間下的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函數實例化參數與直接實例化相同。默認是用來實例化\Think\Model下的模型類文件的。

當然也可以實例化其他的公共模型類,例如:

$User = M('\Home\Model\CommonModel:User','ln_',$connection);

相當於$User = new \Home\Model\CommonModel('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 \Think\Model();

       $User = D('User');  相當於  $User = new \Home\Model\UserModel();  使用默認的模塊(DEFAULT_MODULE)

       $User = D('User','Model_1');  相當於  $User = new \Home\Model_1\UserModel();  

  注意:上述實例化的前提是,默認模塊(DEFAULT_MODULE)Home中的模型層中有相應的模型類文件。當默認模塊的模型層中不存在該模型類文件,D函數會嘗試實例化

公共模塊(Common)下的模型層中的模型類文件。對於上述例子中的第二項:不存在,則$User = new \Common\Model\UserModel();

  2)用於自動檢測模型類。如果存在自定義的模型類,則實例化自定義模型類,如果不存在,則會實例化系統的\Think\Model基類,同時對於已實例化過的模型,不會重復去

實例化。

  3)支持跨模塊實例化:跨模塊實例化模型類時,不支持自動加載公共模塊的模型類。

  例如:D('Admin/User'); 實例化Admin模塊中的Model中的UserModel模型類

       D('Extend://Editor/Info); 實例化Extend擴展明明空間下的InfoModel模型類

function D($name='',$layer='') {
    if(empty($name)) return new Think\Model;
    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_MODULE\DEFAULT_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 Think\Model($name);
    }else {
        Think\Log::record('D方法實例化沒找到模型類'.$class,Think\Log::NOTICE);
        $model      =   new Think\Model(basename($name));
    }
    $_model[$name.$layer]  =  $model;
    return $model;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM