ThinkPHP中實例化對象M()和D()的區別,select和find的區別

1.ThinkPHP中實例化對象M()和D()的區別php

在實例化的過程當中,常常使用D方法和M方法,這兩個方法的區別在於M方法實例化模型無需用戶爲每一個數據表定義模型類,若是D方法沒有找到定義的模型類,則會自動調用M方法。
通俗一點說:
M實例化參數是數據庫的表名。
D實例化的是你本身在Model文件夾下面創建的模型文件
thinkphp

例如:$user = new UserModel();
等價於$user = D('user');
若是實例化的是一個空模型
例如 $Demo = new Model();
那麼它等價於 $Demo = M();


D和M的區別主要在於:
M方法不須要建立模型類文件,M方法不會讀取模型類,因此默認狀況下自動驗證是無效的,可是能夠經過動態賦值的方式實現
而D方法必須有建立模型類。

咱們能夠用下面兩種方法去建立一個數據表的映射對象
第一種:$Test = D('Test')
第二種:$Test = new Model('Test')
雖然這兩種均可以對數據進行select,insert,delete,udpate操做,在
數據驗證上有很大的不一樣,用第一種方式實例一個模型就會有數據檢查功能,若是 title 沒有填寫的話就會提示 「請輸入標題」 (這個是tp提供的一個自動驗證功能,固然也須要在相應的model中定義好驗證條件);

若是用第二種就沒有了·····

還有1個區別就是當用了$trueTableName後,必須用$test=d('test'),表示查詢的是test表,

若是用的是$test=m('test'),那麼都表示查詢的數據邊是think_test。

thinkphp2.0版本測試有如此上面的問題,
D就是實例化一個基於Model文件的Model。M則是經過直接實例化Model方法(ThinkPHP基類)來動態的實例化一個Model對象,即便這個對應的Model文件不存在。數據庫

下面列舉常見的字母方法:
============================================================================
A快速實例化Action類庫
B執行行爲類
C配置參數存取方法
D快速實例化Model類庫
F快速簡單文本數據存取方法
L 語言參數存取方法
M快速高性能實例化模型
R快速遠程調用Action類方法
S快速緩存存取方法
U URL動態生成和重定向方法
W 快速Widget輸出方法
 
D函數實例化的是你當前項目的Lib/Model下面的模塊。
若是該模塊不存在的話,直接返回實例化Model的對象(意義就與M()函數相同)。
而M只返回,實例化Model的對象。它的$name參數做爲數據庫的表名來處理對數據庫的操做。
數組

2.thinkphp的select和find的區別緩存

thinkphp是比較好的php開發框架,能比較快速的開發MVC架構的管理系統,咱們須要用到 select()和find()方法,兩個方法都能返回數據集數組,但有什麼不一樣呢?先看一下個人代碼對比:架構

$tech=M('techlevel','HR_CS_','DB_CONFIG2'); 
$Data=$tech->where('id=1')->find(); 
dump($Data); 
$Data=$tech->where('id=1')->select(); 
dump($Data);

結果以下:框架

array(6) { 
  ["ID"] => int(1) 
  ["TechLevel"] => string(2) "10"
  ["Remark"] => string(4) "??"
  ["CreateDate"] => string(19) "2013-03-14 15:14:38"
  ["CreateBy"] => string(5) "admin"
  ["ROW_NUMBER"] => string(1) "1"
} 
    
array(1) { 
  [0] => array(6) { 
    ["ID"] => int(1) 
    ["TechLevel"] => string(2) "10"
    ["Remark"] => string(4) "??"
    ["CreateDate"] => string(19) "2013-03-14 15:14:38"
    ["CreateBy"] => string(5) "admin"
    ["ROW_NUMBER"] => string(1) "1"
  } 
}

 

從上面的代碼能夠看出,find()返回一個一維數組,select()返回一個二維數組,因此在取值時有所不一樣,函數

一維數組取值用 $data["TechLevel"],性能

二維數組取值用 $data[0]["TechLevel"],測試

二者還有一個重要的不一樣之處:讀取數據的操做其實和數據集的相似,select可用的全部連貫操做方法也均可以用於find方法,區別在於find方法最多隻會返回一條記錄,所以limit方法對於find查詢操做是無效的。因爲一開始沒了解這個用法,調試一天也取不值,最後有dump方法纔看到兩個方法的不一樣所在!

相關文章
相關標籤/搜索