首頁 > 後端開發 > php教程 > 詳解TP3函數之M方法和R方法

詳解TP3函數之M方法和R方法

*文
發布: 2023-03-19 09:08:01
原創
5031 人瀏覽過

本文介紹ThinkPHP3函數詳解之M方法和R方法,M方法用於實例化一個基礎模型類,而R方法用於調用某個控制器的操作方法,有興趣的朋友跟著腳本之家的小編一起來學習吧.希望對大家有幫助。

首先介紹ThinkPHP函數詳解:M方法

M方法用於實例化一個基礎模型類,和D方法的差別在於:

1、不需要自訂模型類,減少IO加載,效能較好;

2、實例化後只能呼叫基礎模型類別(預設是Model類別)中的方法;

3、可以在實例化的時候指定表前綴、資料庫和資料庫的連接資訊;

D方法的強大則體現在你封裝的自訂模型類別有多強,不過隨著新版ThinkPHP框架的基礎模型類別的功能越來越強大,M方法也比D方法越來越實用了。

M方法的呼叫格式:

M('[基礎模型名稱:]模型名稱','資料表前綴','資料庫連接資訊')

我們來看下M方法具體有哪些用法:

1、實例化基礎模型(Model) 類別

在沒有定義任何模型的時候,我們可以使用下面的方法實例化一個模型類來進行操作:

//实例化User模型
$User = M('User');
//执行其他的数据操作
$User->select();
登入後複製

這種方法最簡單高效,因為不需要定義任何的模型類,所以支援跨項目呼叫。缺點也是因為沒有自訂的模型類,因此無法寫入相關的業務邏輯,只能完成基本的CURD作業。

$User = M('User');
登入後複製

其實等效於:

$User = new Model('User');
登入後複製

表示操作think_user表。 M方法和D方法一樣也有單例功能,多次呼叫並不會重複實例化。 M方法的模型名參數在轉換成資料表的時候會自動轉換成小寫,也就是說ThinkPHP的資料表命名規範是全小寫的格式。

2、實例化其他公共模型類別

第一種方式實例化因為沒有模型類別的定義,因此很難封裝一些額外的邏輯方法,不過大多數情況下,也許只是需要擴展一些通用的邏輯,那麼就可以試試下面一個方法。

$User = M('CommonModel:User');
登入後複製

改用法其實等效於:

$User = new CommonModel('User');
登入後複製

因為系統的模型類別都能夠自動加載,因此我們不需要在實例化之前手動進行類別庫導入操作。模型類別CommonModel必須繼承Model。我們可以在CommonModel類裡面定義一些通用的邏輯方法,就可以省去為每個資料表定義具體的模型類,如果你的專案已經有超過100個資料表了,而大多數情況都是一些基本的CURD操作的話,只是個別模型有一些複雜的業務邏輯需要封裝,那麼第一種方式和第二種方式的結合就是一個不錯的選擇。

3、傳入表格前綴、資料庫和其他資訊

M方法有三個參數,第一個參數是模型名稱(可以包含基礎模型類別和資料庫),第二個參數用於設定資料表的前綴(留空則取目前項目配置的表前綴),第三個參數用於設定目前使用的資料庫連接資訊(留空則取目前項目配置的資料庫連線資訊),例如:

$User = M('db2.User','think_');
登入後複製

表示實例化Model模型類,並操作db2資料庫中的think_user表。

如果第二個參數留空或不傳,表示使用目前專案配置中的資料表前綴,如果操作的資料表沒有表前綴,那麼可以使用:

$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('CommonModel:db2.User','think_');
登入後複製

如果要實例化分層模型的話,利用公共模型類別的方式,我們可以使用:

M('UserLogic:User');
登入後複製

來實例化UserLogic,雖然這樣做的意義不大,因為可以用

D('User','Logic');
登入後複製

實現同樣的功能。

ThinkPHP函數詳解:R方法

R方法用於呼叫某個控制器的操作方法,是A方法的進一步增強和補充。關於A方法的用法請見這裡。

R方法的呼叫格式:

R('[項目://][分組/]模組/操作','參數','控制器層名稱')

例如,我們定義了一個操作方法為:

class UserAction extends Action {
 public function detail($id){
  return M('User')->find($id);
 }
 }
登入後複製

那麼就可以透過R方法在其他控制器裡面呼叫這個操作方法(一般R方法用於跨模組呼叫)

$data = R('User/detail',array('5'));
登入後複製

表示调用User控制器的detail方法(detail方法必须是public类型),返回值就是查询id为5的一个用户数据。如果你要调用的操作方法是没有任何参数的话,第二个参数则可以留空,直接使用:

$data = R('User/detail');
登入後複製

也可以支持跨分组和项目调用,例如:

R('Admin/User/detail',array('5'));
登入後複製

表示调用Admin分组下面的User控制器的detail方法。

R('Admin://User/detail',array('5'));
登入後複製

表示调用Admin项目下面的User控制器的detail方法。

官方的建议是不要在同一层多太多调用,会引起逻辑的混乱,被公共调用的部分应该封装成单独的接口,可以借助3.1的新特性多层控制器,单独添加一个控制器层用于接口调用,例如,我们增加一个Api控制器层,

class UserApi extends Action {
 public function detail($id){
  return M('User')->find($id);
 }
 }
登入後複製

然后,使用R方法调用

$data = R('User/detail',array('5'),'Api');
登入後複製

也就是说,R方法的第三个参数支持指定调用的控制器层。

同时,R方法调用操作方法的时候可以支持操作后缀设置C('ACTION_SUFFIX'),如果你设置了操作方法后缀,仍然不需要更改R方法的调用方式。

相关推荐:

详解ThinkPHP5 instance的实现

ThinkPHP下表单令牌错误的分析与解决

详解ThinkPHP如何实现生成和校验验证码

以上是詳解TP3函數之M方法和R方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板