先看看thinkphp的文檔吧:這是我在網上找的一個不錯的鏈接地址,對自己有用,同時相信對讀者也有用吧。
http://doc.thinkphp.cn/manual/class.html
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ThinkPHP 跨模塊調用操作方法(A方法與R方法)
跨模塊調用操作方法
前面說了可以使用 $this 來調用當前模塊內的方法,但實際情況中還經常會在當前模塊調用其他模塊的方法。ThinkPHP 內置了 A 方法與 R 方法這兩個特殊的大寫字母方法來處理跨模塊調用的問題。
目前 Index 模塊內有 index 操作,User 模塊有 showName 操作,User 模塊及 showName 操作具體代碼如下:
我們將在 Index 模塊的 index 操作中調用上面的 showName 操作。
- <?php?
- class?UserAction?extends?Action{?
- public?function?showName(){?
- echo?"我叫小明。";?
- }?
- }?
- ?>
通過 A 方法跨模塊調用操作
A 方法用于實例化其他模塊(當于 new 關鍵字),模塊被實例化之后,就可以以對象的方式調用模塊內的操作。
在 Index 模塊的 index 操作中調用 User 模塊的 showName 操作實例:
A 方法還支持跨分組調用和跨項目調用模塊,語法如下:
- <?php?
- class?IndexAction?extends?Action{?
- public?function?index(){?
- header("Content-Type:text/html;?charset=utf-8");?
- ?
- $User?=?A('User');?
- ?
- $User->showName();?
- }?
- }?
- ?>
A('<項目名://><分組名/>模塊名')
// 常用例子如下
A('User') //調用當前項目的 User 模塊,如上面的例子
A('Admin://User') //調用 Admin 項目的 User 模塊
A('Admin/User') //調用 Admin 分組的 User 模塊
A('Admin://Tool/User') //調用 Admin 項目 Tool 分組的 User 模塊
ThinkPHP 還提供了 R 方法,可直接調用其他模塊的操作方法,將上面使用 A 方法的例子更改為 R 方法:
R 方法同樣也支持跨分組調用和跨項目調用方法,語法如下:
- <?php?
- class?IndexAction?extends?Action{?
- public?function?index(){?
- header("Content-Type:text/html;?charset=utf-8");?
- ?
- R('User/showName');?
- }?
- }?
- ?>
R('<項目名://><分組名/>模塊名/操作'<, array()>)
// 常用例子如下
R('User/showName') //調用當前項目的 User 模塊的 showName 方法,如上面的例子
R('Admin://User/showName') //調用 Admin 項目 User 模塊的 showName 方法
R('Admin/User/showName') //調用 Admin 分組 User 模塊的 showName 方法
R('Admin://Tool/User/info') //調用 Admin 項目 Tool 分組的 User 模塊的 info 方法
R 方法接收參數
R 方法也支持對調用的方法傳入參數,因為實際上調動的操作,可能是需要傳入參數的。
R 方法的第二個參數為數組,該數組將作為被調用操作的參數傳入。如下面的例子所示:
R( 'User/showName',array($_GET('id')) );//這個時候,你可以使用//http://localhost/Index.php/Index/output/name/gaoke訪問
該例子表示 showName 操作將接受 5 這樣一個參數。而對應的 showName 操作可能為:
- <?php?
- class?UserAction?extends?Action{?
- public?function?showName($id){?
- ?
- ? ? ?echo "你輸入的ID是:".$id;
- }?
- }?
- ?>
要傳入多個參數,那么將 R 方法的 array() 參數數組依次定義多個元素即可。
ThinkPHP 讀取配置信息與動態配置(C方法)
C 方法是 ThinkPHP 內置的特殊方法,用于在操作和模板里讀取配置文件里的配置信息或者動態配置參數。語法如下:參數說明
- C(?para_name,?value?)
如果只有 para_name 參數時,表示讀取 para_name 配置參數的值;para_name 與 value 都存在時,表示設置 para_name 參數的值為 value。
C 方法讀取配置參數值
假設項目配置里有如下配置信息:
下面是在模板里面讀取配置參數的例子:
- ?
- 'COOKIE_EXPIRE'?=>?3600,??
- 'COOKIE_DOMAIN'?=>?'.5idev.com',??
- 'COOKIE_PATH'?=>?'/',??
- 'COOKIE_PREFIX'?=>?'',?
配置文件中支持二維數組的配置,那么要讀取二維配置,可以使用 . 符號來表示層級:
- <title>{:C('COOKIE_EXPIRE')}</title>
當讀取的參數沒有在配置文件里定義時,C 方法返回 NULL。
- C('SITE_CONFIG.DOMAIN_NAME')
ThinkPHP 動態配置
ThinkPHP 慣例配置與項目配置都是通過預先定義配置文件的方式來配置需要的參數,而在具體的操作方法里面,還可以通過 C 方法來動態改變或新增配置參數。
下面的例子將 Coodie 有效期變更為 7200 秒:
同樣動態配置二維數組參數,通過 . 符號來區分層級關系:
- C('COOKIE_EXPIRE',7200);
- C('SITE_CONFIG.DOMAIN_NAME','example.com')
?D方法
?默認的 D方法 只能支持調用當前項目的模型,如果需要跨項目調用,需要使用:
- $User?=?D('User',?'Admin');??
- $User?=?D('Admin.User');?
查看 D快捷方法 實例:《ThinkPHP 表單數據智能寫入 create 方法》
實例化空模型類
如果需要使用原生 SQL ,需要實例化一個空模型:
- $Model?=?new?Model();?
- ?
- $Model->query('SELECT?*?FROM?think_user');
M方法和D方法的區別
ThinkPHP 中M方法和D方法都用于實例化一個模型類,M方法 用于高效實例化一個基礎模型類,而 D方法 用于實
例化一個用戶定義模型類。
使用M方法
如果是如下情況,請考慮使用 M方法:
對數據表進行簡單的 CURD 操作而無復雜的業務邏輯時
只有個別的表有較為復雜的業務邏輯時,將 M方法 與實例化 CommonModel 類進行結合使用
M方法 甚至可以簡單看著就是對參數表名對應的數據表的操作:
$User = M('User');
使用D方法
如果是如下情況,請考慮使用 D方法:
需要使用 ThinkPHP 模型中一些高級功能如自動驗證功能(create()方法中實現)、關聯模型等
業務邏輯比較復雜,且涉及的表眾多
將業務邏輯定義在了自定義的模型類里面(Lib/Model目錄下),而想在操作中實現這些業務邏輯
另外 D方法 不支持跨項目調用,需要使用:
提示
啟用了項目分組后,Model 類并不必然對應著項目分組。多個項目組之間共有的模型類,統一放在 Model 目錄下
,可以直接使用D('ModelName') 實例化。而 D('User.UserInfo') 并不表示 User 一定是一個項目分組,也可以
僅僅是對 Model 下文件的一個分類目錄,D('User.UserInfo') 實例化的是 User 目錄下的 UserInfo 模型類。
總結
M方法 和 D方法 都可以在模型類文件不存在的情況下直接使用的,但顯然 M方法 更高效;但要使用模型類里面
業務邏輯,就必須使用 D方法。
一個比較形象的比喻就是:M方法 就如一臺剛裝好操作系統的電腦,只能使用一些基本功能;而 D方法 就如在裝
好的系統上再安裝了一些如 Office、QQ 等應用軟件,功能更加強大,同時整個電腦運行速度也變慢了。
以上是對 M方法和D方法區別的一些總結,M方法 和 D方法 要根據實際情況來具體選擇。
ThinkPHP 中M方法和D方法都用于實例化一個模型類,M方法 用于高效實例化一個基礎模型類,而 D方法 用于實
例化一個用戶定義模型類。
使用M方法
如果是如下情況,請考慮使用 M方法:
對數據表進行簡單的 CURD 操作而無復雜的業務邏輯時
只有個別的表有較為復雜的業務邏輯時,將 M方法 與實例化 CommonModel 類進行結合使用
M方法 甚至可以簡單看著就是對參數表名對應的數據表的操作:
$User = M('User');
使用D方法
如果是如下情況,請考慮使用 D方法:
需要使用 ThinkPHP 模型中一些高級功能如自動驗證功能(create()方法中實現)、關聯模型等
業務邏輯比較復雜,且涉及的表眾多
將業務邏輯定義在了自定義的模型類里面(Lib/Model目錄下),而想在操作中實現這些業務邏輯
另外 D方法 不支持跨項目調用,需要使用:
- $User?=?D('User',?'Admin');??
- $User?=?D('Admin.User');?
提示
啟用了項目分組后,Model 類并不必然對應著項目分組。多個項目組之間共有的模型類,統一放在 Model 目錄下
,可以直接使用D('ModelName') 實例化。而 D('User.UserInfo') 并不表示 User 一定是一個項目分組,也可以
僅僅是對 Model 下文件的一個分類目錄,D('User.UserInfo') 實例化的是 User 目錄下的 UserInfo 模型類。
總結
M方法 和 D方法 都可以在模型類文件不存在的情況下直接使用的,但顯然 M方法 更高效;但要使用模型類里面
業務邏輯,就必須使用 D方法。
一個比較形象的比喻就是:M方法 就如一臺剛裝好操作系統的電腦,只能使用一些基本功能;而 D方法 就如在裝
好的系統上再安裝了一些如 Office、QQ 等應用軟件,功能更加強大,同時整個電腦運行速度也變慢了。
以上是對 M方法和D方法區別的一些總結,M方法 和 D方法 要根據實際情況來具體選擇。