1. 程式人生 > >thinkphp中的大字母的意思

thinkphp中的大字母的意思

ont ati ice 區分大小寫 多太 屬於 函數重載 bsp 刪除

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(‘[項目://][分組/]模塊/操作‘,‘參數‘,‘控制器層名稱‘)
例如,我們定義了一個操作方法為:

  1. class UserAction extends Action {
  2. public function detail($id){
  3. return M(‘User‘)->find($id);
  4. }
  5. }

那麽就可以通過R方法在其他控制器裏面調用這個操作方法(一般R方法用於跨模塊調用)

  1. $data = R(‘User/detail‘,array(‘5‘));

表示調用User控制器的detail方法(detail方法必須是public類型),返回值就是查詢id為5的一個用戶數據。如果你要調用的操作方法是沒有任何參數的話,第二個參數則可以留空,直接使用:

  1. $data = R(‘User/detail‘);

也可以支持跨分組和項目調用,例如:

  1. R(‘Admin/User/detail‘,array(‘5‘));

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

  1. R(‘Admin://User/detail‘,array(‘5‘));

表示調用Admin項目下面的User控制器的detail方法。
官方的建議是不要在同一層多太多調用,會引起邏輯的混亂,被公共調用的部分應該封裝成單獨的接口,可以借助3.1的新特性多層控制器,單獨添加一個控制器層用於接口調用,例如,我們增加一個Api控制器層,

  1. class UserApi extends Action {
  2. public function detail($id){
  3. return M(‘User‘)->find($id);
  4. }
  5. }

然後,使用R方法調用

  1. $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(‘計數位置‘[,‘步進值‘])
例如,我們要統計頁面中的查詢次數,可以用

  1. N(‘read‘,1);

表示每次執行到該位置都會引起計數器加1,到頁面結束之前,我們就可以用

  1. $count = N(‘read‘);

來統計當前頁面執行的查詢數目。
如果你希望計數器每次增加5,那麽可以改變步進值,例如:

  1. N(‘score‘,5);

需要註意的是,N方法頁面執行完畢後的統計結果不會帶入下次統計。

G方法的作用包括標記位置和區間統計兩個功能,下面來看下具體用法:

標記位置

G方法的第一個用法就是標記位置,例如:

  1. G(‘begin‘);

表示把當前位置標記為begin標簽,並且記錄當前位置的執行時間,如果環境支持的話,還能記錄內存占用情況。可以在任何位置調用G方法標記。

運行時間統計

標記位置後,我們就可以再次調用G方法進行區間統計了,例如:

  1. G(‘begin‘);
  2. // ...其他代碼段
  3. G(‘end‘);
  4. // ...也許這裏還有其他代碼
  5. // 進行統計區間
  6. echo G(‘begin‘,‘end‘).‘s‘;

G(‘begin‘,‘end‘) 表示統計begin位置到end位置的執行時間(單位是秒),begin必須是一個已經標記過的位置,如果這個時候end位置還沒被標記過,則會自動把當前位置標記為end標簽,輸出的結果類似於:

  1. 0.0056s

默認的統計精度是小數點後4位,如果覺得這個統計精度不夠,還可以設置例如:

  1. G(‘begin‘,‘end‘,6).‘s‘;

可能的輸出會變成:

  1. 0.005587s

內存開銷統計

如果你的環境支持內存占用統計的話,還可以使用G方法進行區間內存開銷統計(單位為kb),例如:

  1. echo G(‘begin‘,‘end‘,‘m‘).‘kb‘;

第三個參數使用m表示進行內存開銷統計,輸出的結果可能是:

  1. 625kb

同樣,如果end標簽沒有被標記的話,會自動把當前位置先標記位end標簽。
如果環境不支持內存統計,則該參數無效,仍然會進行區間運行時間統計。
忘掉debug_start、debug_end吧,大道至簡,你懂的~

F方法其實是S方法的一個子集功能,僅用於簡單數據緩存,並且只能支持文件形式,不支持緩存有效期,因為采用的是PHP返回方式,所以其效率較S方法較高,因此我們也稱之為快速緩存方法。
F方法的特點是:
簡單數據緩存;
文件形式保存;
采用PHP返回數據方式加載緩存;
支持子目錄緩存以及自動創建;
支持刪除緩存和批量刪除;
寫入和讀取緩存

  1. F(‘data‘,‘test data‘);

默認的保存起始路徑是DATA_PATH(該常量在默認配置位於RUNTIME_PATH.‘Data/‘下面),也就是說會生成文件名為DATA_PATH.‘data.php‘的緩存文件。
註意:確保你的緩存標識的唯一,避免數據覆蓋和沖突。
下次讀取緩存數據的時候,使用:

  1. $Data = F(‘data‘);

我們可以采用子目錄方式保存,例如:

  1. F(‘user/data‘,$data); // 緩存寫入
  2. F(‘user/data‘); // 讀取緩存

就會生成DATA_PATH.‘user/data.php‘ 緩存文件,如果user子目錄不存在的話,則會自動創建,也可以支持多級子目錄,例如:

  1. F(‘level1/level2/data‘,$data);

如果需要指定緩存的起始目錄,可以用下面的方式:

  1. F(‘data‘,$data,TEMP_PATH);

獲取的時候則需要使用:

  1. F(‘data‘,‘‘,TEMP_PATH);

刪除緩存

刪除緩存也很簡單,使用:

  1. F(‘data‘,NULL);

第二個參數傳入NULL,則表示刪除標識為data的數據緩存。
支持批量刪除功能,尤其是針對子目錄緩存的情況,假設我們要刪除user子目錄下面的所有緩存數據,可以使用:

  1. F(‘user/*‘,NULL);

又或者使用過濾條件刪除,例如:

  1. F(‘user/[^a]*‘,NULL);

C方法ThinkPHP用於設置、獲取,以及保存配置參數的方法,使用頻率較高。
了解C方法需要首先了解下ThinkPHP的配置,因為C方法的所有操作都是圍繞配置相關的。ThinkPHP的配置文件采用PHP數組格式定義。
由於采用了函數重載設計,所以用法較多,我們來一一說明下。
設置參數

  1. C(‘DB_NAME‘,‘thinkphp‘);

表示設置DB_NAME配置參數的值為thinkphp,由於配置參數不區分大小寫,所以下面的寫法也是一樣:[-more-]

  1. C(‘db_name‘,‘thinkphp‘);

但是建議保持統一大寫的配置定義規範。
項目的所有參數在未生效之前都可以通過該方法動態改變配置,最後設置的值會覆蓋前面設置或者慣例配置裏面的定義,也可以使用參數配置方法添加新的配置。
支持二級配置參數的設置,例如:

  1. C(‘USER.USER_ID‘,8);

配置參數不建議超過二級。
如果要設置多個參數,可以使用批量設置,例如:

  1. $config[‘user_id‘] = 1;
  2. $config[‘user_type‘] = 1;
  3. C($config);

如果C方法的第一個參數傳入數組,就表示批量賦值,上面的賦值相當於:

  1. C(‘USER_ID‘,1);
  2. C(‘USER_TYPE‘,1);

獲取參數
要獲取設置的參數,可以用:

  1. $userId = C(‘USER_ID‘);
  2. $userType = C(‘USER_TYPE‘);

如果USER_ID參數尚未定義過,則返回NULL。
也可以支持獲取二級配置參數,例如:

  1. $userId = C(‘USER.USER_ID‘);

如果傳入的配置參數為空,表示獲取全部的參數:

  1. $config = C();

保存設置
3.1版本增加了一個永久保存設置參數的功能,僅針對批量賦值的情況,例如:

  1. $config[‘user_id‘] = 1;
  2. $config[‘user_type‘] = 1;
  3. C($config,‘name‘);

在批量設置了config參數後,會連同當前所有的配置參數保存到緩存文件(或者其他配置的緩存方式)。
保存之後,如果要取回保存的參數,可以用

  1. $config = C(‘‘,‘name‘);

其中name就是前面保存參數時用的緩存的標識,必須一致才能正確取回保存的參數。取回的參數會和當前的配置參數合並,無需手動合並。

thinkphp中的大字母的意思