1.ThinkPHP中執行個體化對象M()和D()的差別
在執行個體化的過程中,經常使用D方法和M方法,這兩個方法的差別在于M方法執行個體化模型無需使用者為每個資料表定義模型類,如果D方法沒有找到定義的模型類,則會自動調用M方法。
通俗一點說:
M執行個體化參數是資料庫的表名。
D執行個體化的是你自己在Model檔案夾下面建立的模型檔案
例如:$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()方法,兩個方法都能傳回資料集數組,但有什麼不同呢?先看一下我的代碼對比:
結果如下:
從上面的代碼可以看出,find()傳回一個一維數組,select()傳回一個二維數組,是以在取值時有所不同,
一維數組取值用 $data["TechLevel"],
二維數組取值用 $data[0]["TechLevel"],
兩者還有一個重要的不同之處:讀取資料的操作其實和資料集的類似,select可用的所有連貫操作方法也都可以用于find方法,差別在于find方法最多隻會傳回一條記錄(沒有則傳回資料錯誤),是以limit方法對于find查詢操作是無效的。由于一開始沒了解這個用法,調試一天也取不值,最後有dump方法才看到兩個方法的不同所在!