天天看點

ThinkPHP中執行個體化對象M()和D()的差別,select和find的差別

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方法才看到兩個方法的不同所在!