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

ThinkPHP 模型實例化四大方式詳解:M、D、自定義模型、空模型

     編輯:PHP 綜合知識

ThinkPHP 提供多樣化的模型實例化方式,滿足從簡單 CRUD 到複雜業務邏輯的不同需求。本文系統整理四種實例化模式,說明適用場景、程式碼範例與注意事項,助你選擇最適合的寫法。

方式一:基礎模型 M() / new Model()

最常用、最輕量的方式,適合無自定義邏輯的通用資料表操作。

$user = M('User');          // 等同於 new Model('User')
$user = new Model('User');  // 完整寫法
// 直接操作 user 表,不需建立模型類別檔案
  • 自動對應資料表 think_user (依前綴設定)
  • 支援連貫操作:$user->where(...)->select()
  • 不支援自定義方法、自動驗證/完成

方式二:公共模型 CommonModel

建立基礎模型類別封裝共用邏輯 (如軟刪除、時間戳自動寫入),具體模型繼承即可複用。

<?php
// CommonModel.class.php
class CommonModel extends Model {
    protected $autoWriteTimestamp = true;
    public function softDelete($id) {
        return $this->where(['id'=>$id])->save(['status'=>-1, 'delete_time'=>time()]);
    }
}

// 使用方式
$user = new CommonModel('User');  // 實例化 user 表並擁有 CommonModel 方法
$user->softDelete(123);
  • 適用於多個模型共享通用業務邏輯
  • 減少重複程式碼,維護性佳

方式三:自定義模型 UserModel (配合 D())

針對單一資料表建立專屬模型類別,封裝完整業務邏輯、驗證規則、關聯關係。

<?php
// UserModel.class.php
class UserModel extends Model {
    protected $_validate = array(
        array('email', 'email', '信箱格式錯誤'),
        array('password', 'require', '密碼必填'),
    );
    protected $_auto = array(
        array('create_time', 'time', self::MODEL_INSERT, 'function'),
        array('password', 'md5', self::MODEL_BOTH, 'function'),
    );
    public function getUserWithProfile($id) {
        return $this->relation(true)->find($id);
    }
}

// 實例化 (注意大小寫)
$user = D('User');       // 推薦:自動檢測、單例、支援跨模組
$user = new UserModel(); // 手動實例化
  • D() 會自動快取實例,避免重複實例化
  • 不存在對應模型類別時會拋出異常
  • 支援 _validate、_auto、_link 等進階特性
  • 僅限當前專案/應用下的模型

方式四:空模型 M() / new Model() (無參數)

不綁定特定資料表,配合原生 SQL 查詢、跨表操作、動態指定表名。

$model = M();              // 等同 new Model()
$model = new Model();

// 直接執行 SQL
$list = $model->query('SELECT * FROM wp_users WHERE status=1');

// 動態指定表名
$model->table('think_order')->where('uid=1')->select();

// 事務操作
$model->startTrans();
try {
    $model->table('user')->save(['score'=>10]);
    $model->table('log')->add(['uid'=>1, 'action'=>'add_score']);
    $model->commit();
} catch (Exception $e) {
    $model->rollback();
}

選擇建議決策樹

  1. 需封裝業務邏輯/驗證/關聯?→ 方式三 D('ModelName')
  2. 多模型共用通用方法?→ 方式二 CommonModel
  3. 單純 CRUD、無特殊邏輯?→ 方式一 M('Table')
  4. 複雜 SQL、跨表、動態表名?→ 方式四 M() + query/execute

常見誤區提醒

  • M('User') 與 D('User') 同時存在時,D() 優先載入自定義模型類別
  • 模型類別檔名必須為 UserModel.class.php (大小寫敏感)
  • 跨模組調用模型請使用 D('Admin.User') 格式
  • 空模型 M() 不支援 _validate/_auto 等自動功能

掌握四種實例化方式的差異與適用場景,能讓 ThinkPHP 專案的資料層架構更清晰、維護更輕鬆。

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