ThinkPHP 的 D 和 M 有什麼分別?

來源:互聯網
上載者:User

回複內容:

你可以參考我的視訊。。。M是使用系統內建的model,不需要自訂模型,而D的話,需要自訂模型。 M是快速執行個體化模型,不需要你有相應的model類檔案,D是必須要建立一個model類才能執行個體化 根據不同的模型定義,我們有幾種執行個體化模型的方法,下面來分析下什麼情況下用什麼方法:

1、執行個體化基本模型(Model) 類
在沒有定義任何模型的時候,我們可以使用下面的方法執行個體化一個模型類來進行操作:
$User = new Model('User');
或者使用M快捷方法執行個體化是等效的
$User = M('User');
$User->select(); // 進行其他的資料操作
這種方法最簡單高效,因為不需要定義任何的模型類,所以支援跨項目調用。缺點也是因為沒有自訂的模型類,因此無法寫入相關的商務邏輯,只能完成基本的CURD操作。

2、執行個體化其他模型類
第一種方式執行個體化因為沒有模型類的定義,因此很難封裝一些額外的邏輯方法,不過大多數情況下,也許只是需要擴充一些通用的邏輯,那麼就可以嘗試下面一種方法。
M方法預設是執行個體化Model類,如果需要執行個體化其他模型類,可以使用
$User = M('User', 'CommonModel');
上面的方法等效於
$User = new CommonModel('User');
因為系統的模型類都能夠自動載入,因此我們不需要在執行個體化之前手動進行類庫匯入操作。模型類CommonModel必須繼承Model,如果沒有定義別名匯入的話,需要放在項目Model下。我們可以在CommonModel類裡面定義一些通用的邏輯方法,就可以省去為每個資料表定義具體的模型類,如果你的項目已經有超過100個資料表了,而大多數情況都是一些基本的CURD操作的話,只是個別模型有一些複雜的商務邏輯需要封裝,那麼第一種方式和第二種方式的結合是一個不錯的選擇。

3、執行個體化使用者定義的模型(×××Model)類
這種情況是使用的最多的,一個項目不可避免的需要定義自身的商務邏輯實現,就需要針對每個資料表定義一個模型類,例如UserModel 、InfoModel等等。
定義的模型類通常都是放到項目的Lib\Model目錄下面。例如,
class UserModel extends Model{
Public function myfun(){
// 添加自己的商務邏輯
// ………
}
}
其實模型類還可以繼承一個使用者自訂的公用模型類,而不是只能繼承Model類。
要執行個體化自訂模型類,可以使用下面的方式:
$User = new UserModel();
或者使用D快捷方法執行個體化是等效的
$User = D('User');
$User->select(); // 進行其他的資料操作
D方法可以自動檢測模型類,如果存在自訂的模型類,則執行個體化自訂模型類,如果不存在,則會執行個體化Model基類,同時對於已執行個體化過的模型,不會重複去執行個體化。預設的D方法只能支援調用當前項目的模型,如果需要跨項目調用,需要使用:
$User = D('User', 'Admin'); // 執行個體化Admin項目下面的User模型
$User->select();
如果啟用了模組分組功能,可使用:
$User = D('Admin.User');

4、執行個體化空模型類
如果你僅僅是使用原生SQL查詢的話,不需要使用額外的模型類,執行個體化一個空模型類即可進行操作了,例如:
$Model = new Model();
// 或者使用M快捷方法執行個體化是等效的
// $Model = M();
$Model->query('SELECT * FROM think_user where status=1');
空模型類也支援跨項目調用。
D函數必須有Model檔案存在,M不需要,僅僅是產生了一個最基礎的可以對資料庫表操作的Model對象。 簡單粗暴的理解方式是:M是直接執行個體化某個表,D是掛載某個模型
php進階QQ群歡迎加入474370592m方法是對model的封裝相對簡單不靈活。d是調用對應模組基礎上的產生,更加靈活。比如修改調用表名,調用不同模組下的方法都可以使用d方法。
另外你可以在d方法所調用的的模型中,改寫原有方法的建構函式,還有設定其他方法,比如映射方法。也是需要在其中進行設定的。比如可以通過在d方法調用了資料表格之後,在對應model模組下的類檔案中進行細節化的設定。
protected $_scope=array();可以用來設定select檢索的條件
protected $_validate=array();可以用來建立對提交到資料庫之前資料的驗證規則。

這樣D方法就相對M方法更加的靈活,代碼也更變便於閱讀,有關資料操作部分就在C部分執行,而有關的資料驗證,檢索條件等方面就在M方面進行。 D不一定要有相應的model類,可以執行個體化一個空D D方法初始化的對象包含類的方法,而M方法只是初始化的對象只包含Thinkphp內部定義的資料庫模型操作方法。可以簡單的說:D適用於抽象類別的初始化,而M是原始的ORM。
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.