標籤:取數 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函數的區別