ThinkPHP 中M方法和D方法都用於實例化一個模型類,M方法 用於高效實例化一個基礎模型類,而 D方法 用於實例化一個用戶定義模型類。php
若是是以下狀況,請考慮使用 M方法:java
對數據表進行簡單的 CURD 操做而無複雜的業務邏輯時 只有個別的表有較爲複雜的業務邏輯時,將 M方法 與實例化 CommonModel 類進行結合使用
M方法 甚至能夠簡單看着就是對參數表名對應的數據表的操做:數據庫
$User = M('User');
若是是以下狀況,請考慮使用 D方法:c#
須要使用 ThinkPHP 模型中一些高級功能如自動驗證功能(create()方法中實現)、關聯模型等 業務邏輯比較複雜,且涉及的表衆多 將業務邏輯定義在了自定義的模型類裏面(Lib/Model目錄下),而想在操做中實現這些業務邏輯
另外 D方法 不支持跨項目調用,須要使用:app
$User = D('User', 'Admin'); // 實例化 Admin 項目下面的 User 模型 $User = D('Admin.User'); // 啓用了項目分組
啓用了項目分組後,Model 類並沒必要然對應着項目分組。多個項目組之間共有的模型類,統一放在 Model 目錄下,能夠直接使用D('ModelName') 實例化。而 D('User.UserInfo') 並不表示 User 必定是一個項目分組,也能夠僅僅是對 Model 下文件的一個分類目錄,D('User.UserInfo') 實例化的是 User 目錄下的 UserInfo 模型類。函數
M方法 和 D方法 均可以在模型類文件不存在的狀況下直接使用的,但顯然 M方法 更高效;但要使用模型類裏面業務邏輯,就必須使用 D方法。 一個比較形象的比喻就是:M方法 就如一臺剛裝好操做系統的電腦,只能使用一些基本功能;而 D方法 就如在裝好的系統上再安裝了一些如 Office、QQ 等應用軟件,功能更增強大,同時整個電腦運行速度也變慢了。
以上是對 M方法和D方法區別的一些總結,M方法 和 D方法 要根據實際狀況來具體選擇。spa
兩個有共同點..都是實例化對象用的..操作系統
可是 在使用時 二者卻不同...爲何??code
先看看代碼對象
函數M
function M($name = '', $class = 'Model') { static $_model = array(); if (!isset($_model[$name . '_' . $class])) // 默認也就是 new Model($name) $_model[$name . '_' . $class] = new $class($name); //返回實例化對象 return $_model[$name . '_' . $class]; }
$_model[$name . '_' . $class] = new $class($name);
默認也就是 new Model($name)
也就是說 M返回的是Model的對象
若是$name不爲空 那麼$name的意義也就是表明數據庫的表名(這個之後說)
經過直接實例化Model方法(ThinkPHP基類)來動態的實例化一個Model對象,即便這個對應的Model文件不存在
再來看 D方法
具體註釋已經在代碼裏面了
二者對比 你們應該能看出來...
D函數實例化的是 你當前項目的Lib/Model下面的模塊
若是該模塊不存在的話 直接返回實例化Model的對象(意義就與M()函數相同)
而M 只返回 實例化 Model的對象..它的$name參數 做爲數據庫的表名來處理對數據庫的操做
通俗點說,D就是實例化一個基於Model文件的Model,而M則是經過直接實例化Model方法(ThinkPHP基類)來動態的實例化一個Model對象,即便這個對應的Model文件不存在。
再通俗一點說就是:
M實例化參數是數據庫的表名.
D實例化的是你本身在model文件夾下面創建的模型文件.