ThinkPHP 提供了多種模型實例化方式,針對不同業務複雜度與架構需求。本文系統梳理四種核心方式的適用場景、代碼示例與底層機制差異,幫助開發者做出正確選型。
$user = new Model('user'); // 完整寫法
$user = M('user'); // 簡寫助手函數(推薦)
<?php
// Common/Model/CommonModel.class.php
class CommonModel extends Model {
// 定義通用方法:分頁、軟刪除、數據篩選等
public function getPageList($where, $page, $size) { ... }
public function softDelete($id) { ... }
}
?>
// 控制器中使用
$user = new CommonModel('user'); // 實例化 user 表,擁有 CommonModel 能力
$user->getPageList(['status'=>1], 1, 20);
<?php
// Home/Model/UserModel.class.php
class UserModel extends Model {
protected $_validate = [ ... ]; // 自動驗證
protected $_auto = [ ... ]; // 自動完成
// 封裝業務方法
public function register($data) { ... }
public function login($username, $pwd) { ... }
public function getProfile($uid) { ... }
}
?>
// 控制器中使用
$user = new UserModel(); // 無需傳表名,類名約定對應 user 表
$user->register($_POST);
$model = new Model(); // 等價 M()
// 或
$model = M();
| 維度 | M('user') | CommonModel('user') | UserModel() | M()/new Model() |
|---|---|---|---|---|
| 綁定表 | user | user | user (約定) | 無 (動態指定) |
| 自定義方法 | 無 | 繼承自 CommonModel | UserModel 定義 | 無 |
| 自動驗證/完成 | 無 | CommonModel 定義 | UserModel 定義 | 無 |
| 單例緩存 | 是 | 是 | 是 | 否 (每次 new) |
| 推薦場景 | 簡單 CRUD | 通用能力復用 | 核心業務模型 | 動態/臨時/多表 |
$user = D('User'); // 注意大寫 U:對應 UserModel.class.php
需要封裝業務邏輯/驗證/完成?
├─ 是 → 創建 UserModel 類 → 用 D('User') 或 new UserModel()
└─ 否 → 多模型共享通用方法?
├─ 是 → 創建 CommonModel → 用 new CommonModel('table')
└─ 否 → 動態表名/多表/臨時查詢?
├─ 是 → 用 M() 或 new Model() + table()/query()
└─ 否 → 簡單 CRUD → 用 M('table')
理解四種實例化方式的本質差異,能讓你在項目不同階段、不同模塊做出最合適的架構決策,避免「萬金油」模型類膨脹或重複造輪子。