首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

ThinkPHP M() 與 D() 方法區別深度解析:模型實例化的兩種方式

     編輯:PHP 綜合知識

ThinkPHP 提供 M() 和 D() 兩個快捷函數實例化模型,看似相似但核心機制不同,直接影響自動驗證、表名映射等關鍵行為。

核心區別對比

特性M()D()
需要模型類文件否是
讀取模型類定義否是
自動驗證支持默認無效(可動態設置)有效
自動完成支持默認無效有效
表名映射($trueTableName)忽略,按項目前綴解析生效
性能略快(無文件加載)稍慢

實例化方式對比

// 方式 1:D() - 推薦用於業務模型
$User = D('User');           // 加載 UserModel 類
$User = new UserModel();     // 等效寫法

// 方式 2:M() - 輕量級臨時操作
$User = M('User');           // 直接實例化基礎 Model 類
$User = new Model('User');   // 等效寫法

自動驗證行為差異演示

<?php
// UserModel.class.php
class UserModel extends Model {
    protected $_validate = array(
        array('title', 'require', '標題不能為空'),
    );
}

// 控制器中
// D() 方式 - 觸發驗證
$User = D('User');
$User->create();  // 若 title 為空,提示"標題不能為空"

// M() 方式 - 不觸發驗證
$User = M('User');
$User->create();  // 無提示,直接執行

// M() 動態啟用驗證(ThinkPHP 3.2+)
$User = M('User');
$User->validate($validateRules)->create();

表名映射陷阱

class UserModel extends Model {
    protected $trueTableName = 'custom_user_table';  // 實際表名
}

// D('User')  → 查詢 custom_user_table  ✅
// M('User')  → 查詢 think_user (默認前綴)  ❌

選擇建議

  • 業務邏輯層:優先使用 D(),享受完整模型功能(驗證、完成、作用域、關聯)
  • 簡單 CURD/臨時查詢:使用 M(),輕量高效
  • 跨模塊調用:D('Admin.User') 支持模塊前綴
  • 動態表名:M()->table('prefix_custom_table')

版本差異提示

ThinkPHP 5.0+ 推薦使用依賴注入與模型類直接實例化,M()/D() 為向後兼容保留。新項目建議:new \app\common\model\User()。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved