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

來源:互聯網
上載者:User

標籤:取數   sts   支援   執行個體化   log   資料庫連接   lis   使用   pac   

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;}

 

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.