M() 用於實例化基礎模型類(默認 Think\Model),無需定義模型類文件,減少 IO 加載,性能優於 D()。適用於簡單 CRUD、跨項目調用、數據表超多(100+)但邏輯較簡單的場景。
M('[基礎模型名:]模型名', '表前綴', '數據庫連接信息')
$User = M('User'); // 等效 new Model('User')
$User->select(); // 調用基礎模型方法
// 實例化 CommonModel:User,等效 new CommonModel('User')
$User = M('CommonModel:User');
CommonModel 需繼承 Model,可定義通用邏輯方法,減少重複建模。
// 操作 db2 數據庫的 think_user 表
$User = M('db2.User', 'think_');
// 操作 db1 數據庫的 user 表(無前綴)
$User = M('db1.User', null);
// 自定義連接信息(DSN/數組/配置參數)
$User = M('User', 'think_', 'mysql://user_a:1234@localhost:3306/thinkphp');
$User = M('User', 'think_', 'DB_CONFIG'); // 使用配置參數
// 組合:公共模型 + 數據庫 + 前綴
$User = M('CommonModel:db2.User', 'think_');
// 實例化 UserLogic 模型(邏輯層)
M('UserLogic:User');
// 等效 D('User', 'Logic'),但 M 更輕量
R() 用於調用任意控制器的操作方法,是 A() 的增強版,支援參數傳遞、跨分組/項目、指定控制器層。
R('[項目://][分組/]模塊/操作', '參數數組', '控制器層名稱')
// UserAction::detail($id)
class UserAction extends Action {
public function detail($id) {
return M('User')->find($id);
}
}
// 其他控制器中調用
$data = R('User/detail', [5]); // 返回 id=5 的用戶數據
$data = R('User/detail'); // 無參數調用
// Admin 分組下的 User 控制器
R('Admin/User/detail', [5]);
// Admin 項目下的 User 控制器
R('Admin://User/detail', [5]);
官方建議將公共調用封裝為獨立 API 層,避免邏輯混亂:
// 新增 Api 控制器層
class UserApi extends Action {
public function detail($id) {
return M('User')->find($id);
}
}
// 調用時指定層
$data = R('User/detail', [5], 'Api');
'ACTION_SUFFIX'=>'Action',調用方式不變,自動匹配 detailActionR('User/detail', [], 'Api'),職責清晰| 特性 | M() | D() | R() |
|---|---|---|---|
| 需定義模型類 | 否 | 是 | 調用控制器操作 |
| 性能 | 高(無IO) | 中 | 中(實例化控制器) |
| 可用方法 | 基礎模型方法 | 自定義+基礎 | 控制器public方法 |
| 跨項目/分組 | 支援 | 不支援 | 支援 |
| 適用場景 | 簡單CRUD、跨項目、表多 | 複雜業務邏輯 | 跨模塊調用、API封裝 |