M() 是 ThinkPHP 實例化基礎模型(Think\Model)的快捷函數,對比 D()(實例化自定義模型類),M() 無需定義模型類文件、IO 開銷小、性能更高、支援動態指定數據庫連接參數,是輕量級 CURD 操作的首選。
| 特性 | M() | D() |
|---|---|---|
| 模型類 | 基礎 Model 類 | 自定義模型類 (Model/Logic/Service) |
| 業務邏輯封裝 | 不支援 | 支援(在模型類中定義方法) |
| 文件 IO | 無 | 需加載模型類文件 |
| 性能 | 高 | 略低 |
| 跨項目調用 | 支援 | 需複製模型類 |
| 動態指定表前綴/數據庫 | 支援 | 不支援(模型類屬性固定) |
| 單例模式 | 支援 | 支援 |
M('[基礎模型類:]模型名', '表前綴', '數據庫連接信息')
$User = M('User'); // 操作 think_user 表(默認前綴 think_)
$list = $User->select(); // 直接調用 CURD 方法
等效於 new Model('User')。模型名自動轉小寫加前綴:User → think_user。
$User = M('CommonModel:User'); // 使用 CommonModel 基礎類
// 等效 new CommonModel('User')
// CommonModel 需繼承 Model,可封裝通用邏輯(如軟刪除、自動時間戳)
適用於:項目表量大(100+),大多數表僅需基本 CURD,少數複雜表用 D() 定義專屬模型。
// 使用項目配置前綴(默認)
$User = M('User'); // think_user
// 指定自定義前綴
$User = M('User', 'custom_'); // custom_user
// 無前綴表
$User = M('User', null); // user
$User = M('User', ''); // user
// 操作 db2 數據庫的 think_user 表
$User = M('db2.User', 'think_');
// 操作 db1 數據庫的無前綴 user 表
$User = M('db1.User', null);
格式:數據庫配置名.模型名。數據庫配置需在配置文件預定義:
// config.php
'DB_CONFIG' => [
'db1' => 'mysql://user1:pass@localhost:3306/db1',
'db2' => 'mysql://user2:pass@localhost:3306/db2',
]
// 完整 DSN 字符串
$User = M('User', 'think_', 'mysql://user_a:1234@localhost:3306/thinkphp');
// 配置文件引用
$User = M('User', 'think_', 'DB_CONFIG'); // 引用配置項
// 數組格式
$User = M('User', 'think_', [
'db_type' => 'mysql',
'db_host' => '192.168.1.100',
'db_name' => 'thinkphp',
'db_user' => 'readonly',
'db_pwd' => 'secret',
'db_port' => 3306,
'db_charset' => 'utf8',
]);
$User = M('CommonModel:db2.User', 'think_');
// 使用 CommonModel 基礎類,操作 db2 數據庫 think_user 表
若需實例化 Logic/Service 分層模型:
M('UserLogic:User'); // 實例化 UserLogic
// 推薦用 D() 更語義化:
D('User', 'Logic');
M()D() 定義專屬模型類M(),10% 核心表用 D()'User' 實際操作 think_user,數據庫表名建議全小寫M('User') 返回同一實例,屬性修改會殘留M() 實例化不同庫模型,startTrans() 無法跨庫,需分布式事務方案Runtime/Cache/ 或 $model->flush()M() 以極簡 API 提供了強大的動態數據訪問能力,是 ThinkPHP 輕量級開發的利器。理解其參數機制、單例行為、跨庫邏輯,能讓你在性能與靈活性間遊刃有餘。