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(),享受完整模型功能(驗證、完成、作用域、關聯)M(),輕量高效D('Admin.User') 支持模塊前綴M()->table('prefix_custom_table')ThinkPHP 5.0+ 推薦使用依賴注入與模型類直接實例化,
M()/D()為向後兼容保留。新項目建議:new \app\common\model\User()。