1.ThinkPHP中實例化對象M()和D()的區別
在實例化的過程中,經常使用D方法和M方法,這兩個方法的區別在於M方法實例化模型無需用戶為每個數據表定義模型類,如果D方法沒有找到定義的模型類,則會自動調用M方法。
通俗一點說:
M實例化參數是數據庫的表名。
D實例化的是你自己在Model文件夾下面建立的模型文件
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方法才看到兩個方法的不同所在!
