thinkphp中的大字母的意思
ThinkPHP 單字母函數
A() 內部實例化控制器
D() 實例化自定義模型類
M() 實例化一個基礎模型類
R() 調用某個控制器的操作方法
L() 啟用多語言的情況下,設置和獲取當前的語言定義
N() 計數器方法
G() 包括標記位置和區間統計兩個功能
F() 用於簡單數據緩存,並且只能支持文件形式
C() 用於設置、獲取,以及保存配置參數
方法詳解:
A方法用於在內部實例化控制器,調用格式:
A(‘[項目://][分組/]模塊‘,‘控制器層名稱‘)
最簡單的用法:
$User = A(‘User‘);
表示實例化當前項目的UserAction控制器(這個控制器對應的文件位於Lib/Action/UserAction.class.php),如果采用了分組模式,並且要實例化另外一個Admin分組的控制器可以用:
$User = A(‘Admin/User‘);
也支持跨項目實例化(項目的目錄要保持同級)
$User = A(‘Admin://User‘);
表示實例化Admin項目下面的UserAction控制器
3.1版本增加了分層控制器的支持,所以還可以用A方法實例化其他的控制器,例如:
$User = A(‘User‘,‘Event);
實例化UserEvent控制器(對應的文件位於Lib/Event/UserEvent.class.php)。
實例化控制器後,就可以調用該控制器中的方法,不過需要註意的情況是,在跨項目調用的情況下,如果你的操作方法 有針對當前控制器的特殊變量操作,會有一些未知的問題,所以,一般來說,官方建議需要公共調用的控制器層單獨開發,不要有太多的依賴關系。
D方法應該是用的比較多的方法了,用於實例化自定義模型類,是ThinkPHP框架對Model類實例化的一種封裝,並實現了單例模式,支持跨項目和分組調用,調用格式如下:
D(‘[項目://][分組/]模型‘,‘模型層名稱‘)
方法的返回值是實例化的模型對象。
D方法可以自動檢測模型類,如果存在自定義的模型類,則實例化自定義模型類,如果不存在,則會實例化Model基類,同時對於已實例化過的模型,不會重復去實例化。
D方法最常用的用法就是實例化當前項目的某個自定義模型,例如:
// 實例化User模型
$User = D(‘User‘);
會導入當前項目下面的Lib/Model/UserModel.class.php文件,然後實例化UserModel類,所以,實際上的代碼可能和下面的等效:
import(‘@.Model.UserModel‘);
$User = new UserModel();
但是如果使用D方法的話,如果這個UserModel類不存在,則會自動調用
new Model(‘User‘);
並且第二次調用的時候無需再次實例化,可以減少一定的對象實例化開銷。
D方法可以支持跨分組和項目實例化模型,例如:
//實例化Admin項目的User模型
D(‘Admin://User‘)
//實例化Admin分組的User模型
D(‘Admin/User‘)
註意:要實現跨項目調用模型的話,必須確保兩個項目的目錄結構是並列的。
3.1版本開始,由於增加了分層模型的支持,所以D方法也可以實例化其他的模型,例如:
// 實例化UserService類
$User = D(‘User‘,‘Service‘);
// 實例化UserLogic類
$User = D(‘User‘,‘Logic‘);
D(‘User‘,‘Service‘);
會導入Lib/Service/UserService.class.php,並實例化,等效於下面的代碼:
import(‘@.Service.UserService‘);
$User = new UserSerivce();
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:[email protected]:3306/thinkphp‘);
表示基礎模型類用Model,然後對think_user表進行操作,用user_a賬號進行數據庫連接,操作數據庫是thinkphp。
第三個連接信息參數可以使用DSN配置或者數組配置,甚至可以支持配置參數。
例如,在項目配置文件中配置了:
‘DB_CONFIG‘=>‘mysql://user_a:[email protected]:3306/thinkphp‘;
則可以使用:
$User = M(‘User‘,‘think_‘,‘DB_CONFIG‘);
基礎模型類和數據庫可以一起使用,例如:
$User = M(‘CommonModel:db2.User‘,‘think_‘);
如果要實例化分層模型的話,利用公共模型類的方式,我們可以使用:
M(‘UserLogic:User‘);
來實例化UserLogic,雖然這樣做的意義不大,因為可以用
D(‘User‘,‘Logic‘);
實現同樣的功能。
R方法用於調用某個控制器的操作方法,是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方法的調用方式。
L方法用於啟用多語言的情況下,設置和獲取當前的語言定義。
調用格式:L(‘語言變量‘[,‘語言值‘])
設置語言變量
除了使用語言包定義語言變量之外,我們可以用L方法動態設置語言變量,例如:
L(‘LANG_VAR‘,‘語言定義‘);
語言定義不區分大小寫,所以下面也是等效的:
L(‘lang_var‘,‘語言定義‘);
不過規範起見,我們建議統一采用大寫定義語言變量。
L方法支持批量設置語言變量,例如:
$lang[‘lang_var1‘] = ‘語言定義1‘;
$lang[‘lang_var2‘] = ‘語言定義2‘;
$lang[‘lang_var3‘] = ‘語言定義3‘;
L($lang);
表示同時設置3個語言變量lang_var1 lang_var2和lang_var3。
[-more-]
獲取語言變量
$langVar = L(‘LANG_VAR‘);
或者:
$langVar = L(‘lang_var‘);
如果參數為空,表示獲取當前定義的全部語言變量(包括語言定義文件中的):
$lang = L();
或者我們也可以在模板中使用
{$Think.lang.lang_var}
來輸出語言定義。
N方法屬於計數器方法,被用於核心的查詢、緩存統計的計數和統計。但是其實可以用於應用的其他計數用途,用法比較簡單,調用格式:
N(‘計數位置‘[,‘步進值‘])
例如,我們要統計頁面中的查詢次數,可以用
- N(‘read‘,1);
表示每次執行到該位置都會引起計數器加1,到頁面結束之前,我們就可以用
- $count = N(‘read‘);
來統計當前頁面執行的查詢數目。
如果你希望計數器每次增加5,那麽可以改變步進值,例如:
- N(‘score‘,5);
需要註意的是,N方法頁面執行完畢後的統計結果不會帶入下次統計。
G方法的作用包括標記位置和區間統計兩個功能,下面來看下具體用法:
標記位置
G方法的第一個用法就是標記位置,例如:
- G(‘begin‘);
表示把當前位置標記為begin標簽,並且記錄當前位置的執行時間,如果環境支持的話,還能記錄內存占用情況。可以在任何位置調用G方法標記。
運行時間統計
標記位置後,我們就可以再次調用G方法進行區間統計了,例如:
- G(‘begin‘);
- // ...其他代碼段
- G(‘end‘);
- // ...也許這裏還有其他代碼
- // 進行統計區間
- echo G(‘begin‘,‘end‘).‘s‘;
G(‘begin‘,‘end‘) 表示統計begin位置到end位置的執行時間(單位是秒),begin必須是一個已經標記過的位置,如果這個時候end位置還沒被標記過,則會自動把當前位置標記為end標簽,輸出的結果類似於:
- 0.0056s
默認的統計精度是小數點後4位,如果覺得這個統計精度不夠,還可以設置例如:
- G(‘begin‘,‘end‘,6).‘s‘;
可能的輸出會變成:
- 0.005587s
內存開銷統計
如果你的環境支持內存占用統計的話,還可以使用G方法進行區間內存開銷統計(單位為kb),例如:
- echo G(‘begin‘,‘end‘,‘m‘).‘kb‘;
第三個參數使用m表示進行內存開銷統計,輸出的結果可能是:
- 625kb
同樣,如果end標簽沒有被標記的話,會自動把當前位置先標記位end標簽。
如果環境不支持內存統計,則該參數無效,仍然會進行區間運行時間統計。
忘掉debug_start、debug_end吧,大道至簡,你懂的~
F方法其實是S方法的一個子集功能,僅用於簡單數據緩存,並且只能支持文件形式,不支持緩存有效期,因為采用的是PHP返回方式,所以其效率較S方法較高,因此我們也稱之為快速緩存方法。
F方法的特點是:
簡單數據緩存;
文件形式保存;
采用PHP返回數據方式加載緩存;
支持子目錄緩存以及自動創建;
支持刪除緩存和批量刪除;
寫入和讀取緩存
- F(‘data‘,‘test data‘);
默認的保存起始路徑是DATA_PATH(該常量在默認配置位於RUNTIME_PATH.‘Data/‘下面),也就是說會生成文件名為DATA_PATH.‘data.php‘的緩存文件。
註意:確保你的緩存標識的唯一,避免數據覆蓋和沖突。
下次讀取緩存數據的時候,使用:
- $Data = F(‘data‘);
我們可以采用子目錄方式保存,例如:
- F(‘user/data‘,$data); // 緩存寫入
- F(‘user/data‘); // 讀取緩存
就會生成DATA_PATH.‘user/data.php‘ 緩存文件,如果user子目錄不存在的話,則會自動創建,也可以支持多級子目錄,例如:
- F(‘level1/level2/data‘,$data);
如果需要指定緩存的起始目錄,可以用下面的方式:
- F(‘data‘,$data,TEMP_PATH);
獲取的時候則需要使用:
- F(‘data‘,‘‘,TEMP_PATH);
刪除緩存
刪除緩存也很簡單,使用:
- F(‘data‘,NULL);
第二個參數傳入NULL,則表示刪除標識為data的數據緩存。
支持批量刪除功能,尤其是針對子目錄緩存的情況,假設我們要刪除user子目錄下面的所有緩存數據,可以使用:
- F(‘user/*‘,NULL);
又或者使用過濾條件刪除,例如:
- F(‘user/[^a]*‘,NULL);
C方法是ThinkPHP用於設置、獲取,以及保存配置參數的方法,使用頻率較高。
了解C方法需要首先了解下ThinkPHP的配置,因為C方法的所有操作都是圍繞配置相關的。ThinkPHP的配置文件采用PHP數組格式定義。
由於采用了函數重載設計,所以用法較多,我們來一一說明下。
設置參數
- C(‘DB_NAME‘,‘thinkphp‘);
表示設置DB_NAME配置參數的值為thinkphp,由於配置參數不區分大小寫,所以下面的寫法也是一樣:[-more-]
- C(‘db_name‘,‘thinkphp‘);
但是建議保持統一大寫的配置定義規範。
項目的所有參數在未生效之前都可以通過該方法動態改變配置,最後設置的值會覆蓋前面設置或者慣例配置裏面的定義,也可以使用參數配置方法添加新的配置。
支持二級配置參數的設置,例如:
- C(‘USER.USER_ID‘,8);
配置參數不建議超過二級。
如果要設置多個參數,可以使用批量設置,例如:
- $config[‘user_id‘] = 1;
- $config[‘user_type‘] = 1;
- C($config);
如果C方法的第一個參數傳入數組,就表示批量賦值,上面的賦值相當於:
- C(‘USER_ID‘,1);
- C(‘USER_TYPE‘,1);
獲取參數
要獲取設置的參數,可以用:
- $userId = C(‘USER_ID‘);
- $userType = C(‘USER_TYPE‘);
如果USER_ID參數尚未定義過,則返回NULL。
也可以支持獲取二級配置參數,例如:
- $userId = C(‘USER.USER_ID‘);
如果傳入的配置參數為空,表示獲取全部的參數:
- $config = C();
保存設置
3.1版本增加了一個永久保存設置參數的功能,僅針對批量賦值的情況,例如:
- $config[‘user_id‘] = 1;
- $config[‘user_type‘] = 1;
- C($config,‘name‘);
在批量設置了config參數後,會連同當前所有的配置參數保存到緩存文件(或者其他配置的緩存方式)。
保存之後,如果要取回保存的參數,可以用
- $config = C(‘‘,‘name‘);
其中name就是前面保存參數時用的緩存的標識,必須一致才能正確取回保存的參數。取回的參數會和當前的配置參數合並,無需手動合並。
thinkphp中的大字母的意思