# ThinkPHP函數詳解:M函數
[TOC]
M函數用于實例化一個基礎模型類,和D函數的區別在于:
1. 不需要自定義模型類,減少IO加載,性能較好;
2. 實例化后只能調用基礎模型類(默認是Model類)中的函數;
3. 可以在實例化的時候指定表前綴、數據庫和數據庫的連接信息;
D函數的強大則體現在自定義封裝的模型類有多強,不過隨著ThinkPHP框架的基礎模型類的功能越來越強大,M函數也比D函數越來越實用了。
M函數的調用格式:
>[success] **M('[基礎模型名:]模型名','數據表前綴','數據庫連接信息')**
## 實例化基礎模型(Model) 類
在沒有定義任何模型的時候,我們可以使用下面的函數實例化一個模型類來進行操作:
~~~
//實例化User模型
$User = M('User');
//執行其他的數據操作
$User->select();
~~~
這種函數最簡單高效,因為不需要定義任何的模型類,所以支持跨模塊調用。缺點也是因為沒有自定義的模型類,因此無法寫入相關的業務邏輯,只能完成基本的CURD操作。
~~~
$User = M('User');
~~~
其實等效于:
~~~
$User = new Model('User');
~~~
>[danger] M函數和D函數一樣也有單例功能,多次調用并不會重復實例化。M函數的模型名參數在轉換成數據表的時候會自動轉換成小寫,也就是說ThinkPHP的數據表命名規范是全小寫的格式。
## 實例化其他公共模型類
上面的方式實例化因為沒有模型類的定義,因此很難封裝一些額外的邏輯方法,不過大多數情況下,也許只是需要擴展一些通用的邏輯,那么就可以嘗試下面一種方法。
~~~
$User = M('\Home\Model\CommonModel:User');
~~~
改用法其實等效于:
~~~
$User = new \Home\Model\CommonModel('User');
~~~
因為系統的模型類都能夠自動加載,因此我們不需要在實例化之前手動進行類庫導入操作。模型類`\Home\Model\CommonModel`必須繼承Model。我們可以在`\Home\Model\CommonModel`類里面定義一些通用的邏輯方法,就可以省去為每個數據表定義具體的模型類,如果你的項目已經有超過100個數據表了,而大多數情況都是一些基本的CURD操作的話,只是個別模型有一些復雜的業務邏輯需要封裝,那么第一種方式和第二種方式的結合是一個不錯的選擇。
## 傳入表前綴、數據庫和其他信息
M方法有三個參數,
1. 第一個參數是模型名稱(可以包括基礎模型類和數據庫)
2. 第二個參數用于設置數據表的前綴(留空則取當前項目配置的表前綴)
3. 第三個參數用于設置當前使用的數據庫連接信息(留空則取當前項目配置的數據庫連接信息)例如:
### 實例化Model模型類,并操作db2數據庫中的think_user表。
~~~
$User = M('db2.User','think_');
~~~
如果第二個參數留空或者不傳,表示使用當前項目配置中的數據表前綴。
### 如果操作的數據表沒有表前綴,那么可以使用:
~~~
$User = M('db1.User',null);
~~~
表示實例化Model模型類,并操作db1數據庫中的user表。
### 傳入數據庫的連接信息查詢非常規的數據庫數據
$User = M('User','think_','mysql://user_a:1234@localhost:3306/thinkphp');
表示基礎模型類用Model,然后對think_user表進行操作,用user_a賬號進行數據庫連接,操作數據庫是thinkphp。
第三個連接信息參數可以使用DSN配置或者數組配置,甚至可以支持配置參數。
例如,在項目配置文件中配置了:
~~~
'DB_CONFIG'=>'mysql://user_a:1234@localhost:3306/thinkphp';
~~~
則可以使用:
~~~
$User = M('User','think_','DB_CONFIG');
~~~
### 基礎模型類和數據庫可以一起使用
~~~
$User = M('\Home\Model\CommonModel:db2.User','think_');
~~~
如果要實例化分層模型的話,利用公共模型類的方式,我們可以使用:
~~~
M('Home/UserLogic:User');
~~~
來實例化UserLogic,雖然這樣做的意義不大,因為可以用
~~~
D('Home/User','Logic');
~~~
實現同樣的功能。但是D函數無法實施傳入數據庫連接信息,它可以在自定義Model類中定義屬性$connection。
- 開始
- PHP配置參數的介紹
- PHP代碼優化
- php中的命名空間
- PHP文件上傳類
- PHP文件下載
- PHP驗證碼
- ThinkPHP3.2 框架函數
- A函數:實例化控制器
- C函數:設置和獲取配置參數
- D函數:實例化模型
- F 函數:快速緩存設置和存取
- M函數:例化模型(無需定義模型類)
- L函數:設置和獲取語言變量
- S 函數:緩存設置和存取
- R函數:直接調用控制器的操作方法
- U函數:URL地址生成
- I 函數:安全獲取系統輸入變量
- 日志
- ThinkPHP在關閉調試模式導致函數被緩存
- MySQL觸發器使用時遇到的坑
- PHP常用函數
- 五一回家記錄
- window的PHP開發(wamp)下安裝redis擴展
- Windows下安裝使用Redis
- PHP7新特性
- 利用 phpmailer 類實現隊列發送郵件
- GD 庫圖像處理
- 檢測 PHP 模塊是否開啟
- GD 庫操作一般步驟
- GD 庫繪畫改變字體
- GD 繪制驗證碼
- GD 縮略圖實現
- GD 繪制水印
- 日期時間函數庫
- PHP 函數
- 無限極分類