1. 程式人生 > >ThinkPHP函式詳解系列--單字母函式

ThinkPHP函式詳解系列--單字母函式

ThinkPHP中有很多重要的函式,其中大部分是單字母函式,這些函式在開發體驗中發揮了重大的作用。

為了能方便大家學習和掌握,在這裡彙總下ThinkPHP中的經典函式用法,無論你是資深還是菜鳥TPer,絕對不容錯過哦 ^_^

A 函式:例項化控制器

R 函式:直接呼叫控制器的操作方法

C 函式:設定和獲取配置引數

L 函式:設定和獲取語言變數

D 函式:例項化模型

M 函式:例項化模型(無需定義模型類)

N 函式:計數器

G 函式:除錯統計

U 函式:URL地址生成

I 函式:安全獲取系統輸入變數

S 函式:快取設定和存取

F 函式:快速快取設定和存取

session函式:Session操作

cookie函式:Cookie操作

import函式:類庫匯入

ThinkPHP函式詳解:A方法

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)。

例項化控制器後,就可以呼叫該控制器中的方法,不過需要注意的情況是,在跨專案呼叫的情況下,如果你的操作方法 有針對當前控制器的特殊變數操作,會有一些未知的問題,所以,一般來說,官方建議需要公共呼叫的控制器層單獨開發,不要有太多的依賴關係。

ThinkPHP函式詳解:R方法

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方法的呼叫方式。

ThinkPHP函式詳解:C方法

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);

[-more-]
獲取引數
要獲取設定的引數,可以用:
$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函式詳解:L方法

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}

來輸出語言定義。

ThinkPHP函式詳解:D方法

從本篇開始,我們會陸續給大家詳細說明下框架內建函式的用法。

D方法

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();


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:[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');

實現同樣的功能。

ThinkPHP函式詳解:N方法

N方法屬於計數器方法,被用於核心的查詢、快取統計的計數和統計。但是其實可以用於應用的其他計數用途,用法比較簡單,呼叫格式:

N('計數位置'[,'步進值'])

例如,我們要統計頁面中的查詢次數,可以用
N('read',1);


表示每次執行到該位置都會引起計數器加1,到頁面結束之前,我們就可以用
$count = N('read');


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


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

G方法的華麗升級

ThinkPHP長期以來需要通過debug_start、debug_end方法甚至Debug類才能完成的功能,3.1版本中被一個簡單的G方法取代了,不可不謂是一次華麗升級。

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

1.標記位置

G方法的第一個用法就是標記位置,例如:
G('begin');


表示把當前位置標記為begin標籤,並且記錄當前位置的執行時間,如果環境支援的話,還能記錄記憶體佔用情況。可以在任何位置呼叫G方法標記。

2.執行時間統計

標記位置後,我們就可以再次呼叫G方法進行區間統計了,例如:
G('begin');
// ...其他程式碼段
G('end');
// ...也許這裡還有其他程式碼
// 進行統計區間
echo G('begin','end').'s';

G('begin','end') 表示統計begin位置到end位置的執行時間(單位是秒),begin必須是一個已經標記過的位置,如果這個時候end位置還沒被標記過,則會自動把當前位置標記為end標籤,輸出的結果類似於:
80.0056s
預設的統計精度是小數點後4位,如果覺得這個統計精度不夠,還可以設定例如:
9G('begin','end',6).'s';
可能的輸出會變成:
100.005587s

3.記憶體開銷統計

如果你的環境支援記憶體佔用統計的話,還可以使用G方法進行區間記憶體開銷統計(單位為kb),例如:
echo G('begin','end','m').'kb';


第三個引數使用m表示進行記憶體開銷統計,輸出的結果可能是:
12625kb
同樣,如果end標籤沒有被標記的話,會自動把當前位置先標記位end標籤。
如果環境不支援記憶體統計,則該引數無效,仍然會進行區間執行時間統計。

忘掉debug_start、debug_end吧,大道至簡,你懂的~

ThinkPHP函式詳解:U方法

U方法用於完成對URL地址的組裝,特點在於可以自動根據當前的URL模式和設定生成對應的URL地址,格式為:

U('地址','引數','偽靜態','是否跳轉','顯示域名');

在模板中使用U方法而不是固定寫死URL地址的好處在於,一旦你的環境變化或者引數設定改變,你不需要更改模板中的任何程式碼。

在模板中的呼叫格式需要採用 {:U('地址', '引數'…)} 的方式

基本用法

U方法的用法示例:

U('User/add') // 生成User模組的add操作地址


也可以支援分組呼叫:
U('Home/User/add') // 生成Home分組的User模組的add操作地址

U('Blog/cate',array('cate_id'=>1,'status'=>1))
U('Blog/cate','cate_id=1&status=1')
U('Blog/cate?cate_id=1&status=1')


當然,也可以只是寫操作名,表示呼叫當前模組的
U('add') // 生成當前訪問模組的add操作地址


除了分組、模組和操作名之外,我們也可以傳入一些引數:
U('Blog/read?id=1') // 生成Blog模組的read操作 並且id為1的URL地址


U方法的第二個引數支援傳入引數,支援陣列和字串兩種定義方式,如果只是字串方式的引數可以在第一個引數中定義,下面幾種方式都是等效的:
U('Blog/cate',array('cate_id'=>1,'status'=>1))
U('Blog/cate','cate_id=1&status=1')
U('Blog/cate?cate_id=1&status=1')


但是不允許使用下面的定義方式來傳引數:
U('Blog/cate/cate_id/1/status/1')


根據專案的不同URL設定,同樣的U方法呼叫可以智慧地對應產生不同的URL地址效果,例如針對:
U('Blog/read?id=1')


這個定義為例。

如果當前URL設定為普通模式的話,最後生成的URL地址是:
http://serverName/index.php?m=Blog&a=read&id=1
如果當前URL設定為PATHINFO模式的話,同樣的方法最後生成的URL地址是:
http://serverName/index.php/Blog/read/id/1
如果當前URL設定為REWRITE模式的話,同樣的方法最後生成的URL地址是:
http://serverName/Blog/read/id/1
如果你同時還設定了PATHINFO分隔符的話:
'URL_PATHINFO_DEPR'=>'_'

就會生成
http://serverName/Blog_read_id_1

如果當前URL設定為REWRITE模式,並且設定了偽靜態字尾為html的話,同樣的方法最後生成的URL地址是:
http://serverName/Blog/read/id/1.html


如果設定了多個偽靜態支援,那麼會自動取第一個偽靜態字尾新增到URL地址後面,當然你也可以手動在U方法裡面指定要生成的偽靜態字尾,例如:
U('Blog/read','id=1','xml')


就會生成
http://serverName/Blog/read/id/1.xml

路由支援

U方法還可以支援路由,如果我們定義了一個路由規則為:
'news/:id\d'=>'News/read'


那麼可以使用
U('/news/1')

最終生成的URL地址是:
http://serverName/index.php/news/1

域名支援

如果你的應用涉及到多個子域名的操作地址,那麼也可以在U方法裡面指定需要生成地址的域名,例如:
U('Blog/[email protected]','id=1');

@後面傳入需要指定的域名即可。

此外,U方法的第5個引數如果設定為true,表示自動識別當前的域名,並且會自動根據子域名部署設定APP_SUB_DOMAIN_DEPLOY和APP_SUB_DOMAIN_RULES自動匹配生成當前地址的子域名。
如果開啟了URL_CASE_INSENSITIVE,則會統一生成小寫的URL地址。

錨點支援

3.1.2版本開始,U方法還可以支援生成URL地址中的錨點,例如:
U('Blog/read#comment','id=1','html')


就會生成
http://serverName/Blog/read/id/1.html#comment


如果域名和錨點同時使用的話,注意順序為先錨點後域名,例如:
U('Blog/read#[email protected]','id=1');


ThinkPHP函式詳解:I方法

ThinkPHP的I方法是3.1.3版本新增的,如果你是之前的3.*版本的話,可以直接參考使用3.1快速入門教程系列的變數部分。(該用法將會在將來的版本中廢棄,事實上,如果你仍然還在使用該方式會有警告錯誤提示)

概述

正如你所見到的一樣,I方法是ThinkPHP眾多單字母函式中的新成員,其命名來自於英文Input(輸入),主要用於更加方便和安全的獲取系統輸入變數,可以用於任何地方

用法格式如下:

I('變數型別.變數名',['預設值'],['過濾方法'])

變數型別是指請求方式或者輸入型別,包括:

變數型別

含義

get

獲取GET引數

post

獲取POST引數

param

自動判斷請求型別獲取GET、POST或者PUT引數

request

獲取REQUEST 引數

put

獲取PUT 引數

session

獲取 $_SESSION 引數

cookie

獲取 $_COOKIE 引數

server

獲取 $_SERVER 引數

globals

獲取 $GLOBALS引數


注意:變數型別不區分大小寫。

變數名則嚴格區分大小寫。

預設值和過濾方法均屬於可選引數。

用法

我們以GET變數型別為例,說明下I方法的使用:

echo I('get.id'); // 相當於 $_GET['id']
echo I('get.name'); // 相當於 $_GET['name']

支援預設值:
echo I('get.id',0); // 如果不存在$_GET['id'] 則返回0
echo I('get.name',''); // 如果不存在$_GET['name'] 則返回空字串

採用方法過濾:

echo I('get.name','','htmlspecialchars'); // 採用htmlspecialchars方法對$_GET['name'] 進行過濾,如果不存在則返回空字串


支援直接獲取整個變數型別,例如:
I('get.'); // 獲取整個$_GET 陣列


用同樣的方式,我們可以獲取post或者其他輸入型別的變數,例如:
I('post.name','','htmlspecialchars'); // 採用htmlspecialchars方法對$_POST['name'] 進行過濾,如果不存在則返回空字串
I('session.user_id',0); // 獲取$_SESSION['user_id'] 如果不存在則預設為0
I('cookie.'); // 獲取整個 $_COOKIE 陣列
I('server.REQUEST_METHOD'); // 獲取 $_SERVER['REQUEST_METHOD'] 


param變數型別是框架特有的支援自動判斷當前請求型別的變數獲取方式,例如:
echo I('param.id'); 

如果當前請求型別是GET,那麼等效於 $_GET['id'],如果當前請求型別是POST或者PUT,那麼相當於獲取 $_POST['id'] 或者 PUT引數id。
並且param型別變數還可以用數字索引的方式獲取URL引數(必須是PATHINFO模式引數有效,無論是GET還是POST方式都有效),例如:
當前訪問URL地址是
http://serverName/index.php/New/2013/06/01 

那麼我們可以通過
echo I('param.1'); // 輸出2013
echo I('param.2'); // 輸出06
echo I('param.3'); // 輸出01

事實上,param變數型別的寫法可以簡化為:
I('id'); // 等同於 I('param.id')
I('name'); // 等同於 I('param.name')

變數過濾

使用I方法的時候 變數其實經過了兩道過濾,首先是全域性的過濾,全域性過濾是通過配置VAR_FILTERS引數,這裡一定要注意,3.1版本之後,VAR_FILTERS引數的過濾機制已經更改為採用array_walk_recursive方法遞迴過濾了,主要對過濾方法的要求是必須引用返回,所以這裡設定htmlspecialchars是無效的,你可以自定義一個方法,例如:

function filter_default(&$value){
 $value = htmlspecialchars($value);
}

然後配置:

'VAR_FILTERS'=>'filter_default'

如果需要進行多次過濾,可以用:
'VAR_FILTERS'=>'filter_default,filter_exp'

filter_exp方法是框架內建的安全過濾方法,用於防止利用模型的EXP功能進行注入攻擊。
因為VAR_FILTERS引數設定的是全域性過濾機制,而且採用的是遞迴過濾,對效率有所影響,所以,我們更建議直接對獲取變數過濾的方式,除了在I方法的第三個引數設定過濾方法外,還可以採用配置DEFAULT_FILTER引數的方式設定過濾,事實上,該引數的預設設定是:
'DEFAULT_FILTER' => 'htmlspecialchars'

也就說,I方法的所有獲取變數都會進行htmlspecialchars過濾,那麼:
I('get.name'); // 等同於 htmlspecialchars($_GET['name'])


同樣,該引數也可以支援多個過濾,例如:
'DEFAULT_FILTER' => 'strip_tags,htmlspecialchars'
I('get.name'); // 等同於 htmlspecialchars(strip_tags($_GET['name']))


如果我們在使用I方法的時候 指定了過濾方法,那麼就會忽略DEFAULT_FILTER的設定,例如:
echo I('get.name','','strip_tags'); // 等同於 strip_tags($_GET['name'])


I方法的第三個引數如果傳入函式名,則表示呼叫該函式對變數進行過濾並返回(在變數是陣列的情況下自動使用array_map進行過濾處理),否則會呼叫PHP內建的filter_var方法進行過濾處理,例如:
I('post.email','',FILTER_VALIDATE_EMAIL);


表示 會對$_POST['email'] 進行 格式驗證,如果不符合要求的話,返回空字串。
(關於更多的驗證格式,可以參考 官方手冊的filter_var用法。)
或者可以用下面的字元標識方式:
I('post.email','','email');

可以支援的過濾名稱必須是filter_list方法中的有效值(不同的伺服器環境可能有所不同),可能支援的包括:

int
boolean
float
validate_regexp
validate_url
validate_email
validate_ip
string
stripped
encoded
special_chars
unsafe_raw
email
url
number_int
number_float
magic_quotes
callback


在有些特殊的情況下,我們不希望進行任何過濾,即使DEFAULT_FILTER已經有所設定,可以使用:
I('get.name','',NULL);


一旦過濾引數設定為NULL,即表示不再進行任何的過濾。

ThinkPHP函式詳解:cache方法

cache方法是3.0版本開始新增的快取管理方法。

注意:3.1.2版本後因cache方法併入原S方法,所以cache方法不再建議使用,用S方法即可。

cache 用於快取設定、獲取、刪除操作

用法

cache($name, $value='',$options=null)

引數

name(必須):如果傳入陣列 則表示進行快取初始化,如果是字串則表示快取賦值、獲取或者刪除操作。Value(可選):要設定的快取值,如果傳入null表示刪除快取,預設為空字串。options(可選):要設定的快取引數,如果是數字則表示僅設定有效期

返回值

見詳(根據具體的用法返回不同的值)

快取初始化

cache方法傳入陣列即表示進行快取初始化,例如:

1cache(array('type'=>'xcache','prefix'=>'think','expire'=>600));


支援的配置引數根據不同的快取方式(由type引數設定),通用的快取引數包括:

引數名

說明

expire

快取有效期(時間為秒)

length

快取佇列長度

prefix

快取標識字首

type

快取型別


如果沒有設定type引數,則預設為檔案快取,cache方法目前可以支援的快取型別包括File、Apachenote、Apc、Eaccelerator、Memcache、Shmop、Sqlite、Db、Redis、Xcache和WinCache,不同快取型別的快取引數可以參考這裡:動態快取

快取初始化操作後返回的是一個快取例項化物件。

如果你沒有進行快取初始化的話,cache方法會在你進行快取操作之前自動初始化(用系統預設的快取方式和快取引數),預設快取配置引數包括:

/* 資料快取設定 */
'DATA_CACHE_TIME' => 0, // 資料快取有效期 0表示永久快取
'DATA_CACHE_COMPRESS' => false, // 資料快取是否壓縮快取
'DATA_CACHE_CHECK' => false, // 資料快取是否校驗快取
'DATA_CACHE_PREFIX' => '', // 快取字首
'DATA_CACHE_TYPE' => 'File', // 資料快取型別
'DATA_CACHE_PATH' => TEMP_PATH,// 快取路徑設定 (僅對File方式有效)
'DATA_CACHE_SUBDIR' => false, // 使用子目錄快取 (根據快取標識的雜湊建立子目錄)
'DATA_PATH_LEVEL' => 1, // 子目錄快取級別


這些具體的快取引數的用法,我們以後會在快速入門:快取中詳細描述。

快取設定

快取初始化之後,就可以進行快取操作了,
cache('name','value');


會使用當前配置的快取方式用name標識來快取value值。
可以單獨設定該快取資料的有效期,例如:
cache('name','value',3600);


快取資料一個小時。
為了保證快取的安全,建議對返回值做出判斷,如果快取設定失敗,則返回false,否則返回true。
3.1.2版本開始也可以直接在設定快取的同時傳入快取設定引數,例如:
cache('name','value',array('type'=>'xcache','prefix'=>'think','expire'=>600));


獲取快取
$value = cache('name');


如果快取標識不存在或者已經過期,則返回false,否則返回快取值。

刪除快取
cache('name',NULL);


刪除快取標識為name的快取資料。
如果要切換快取方式,可以再次進行快取初始化操作。
或者使用下面的方式:
$cache = cache(array('type'=>'xcache','prefix'=>'think','expire'=>600));
$cache->name = 'value'; // 設定快取
$value = $cache->name; // 獲取快取
unset($cache->name); // 刪除快取

如果你設定了快取字首的話,對應的快取操作只是對應該快取字首標識的,不會影響其他的快取。

ThinkPHP函式詳解:F方法

我們已經瞭解了ThinkPHP中的S方法的用法,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);

ThinkPHP函式詳解:session方法

Session 用於Session 設定、獲取、刪除和管理操作

用法

session($name, $value='')

引數

name(必須):如果傳入陣列 則表示進行session初始化,如果傳入null表示清空當前session,如果是字串則表示session賦值、獲取或者操作。Value(可選):要設定的session值,如果傳入null表示刪除session,預設為空字串

返回值

見詳(根據具體的用法返回不同的值)

session函式是一個多元化操作函式,傳入不同的引數呼叫可以完成不同的功能操作,包括下面一些功能。[-more-]

session初始化設定

如果session方法的name引數傳入陣列則表示進行session初始化設定,例如:
session(array('name'=>'session_id','expire'=>3600));

支援傳入的session引數包括:

引數名

說明

id

session_id值

name

session_name 值

path

session_save_path 值

prefix

session 本地化空間字首

expire

session.gc_maxlifetime 設定值

domain

session.cookie_domain 設定值

use_cookies

session.use_cookies 設定值

use_trans_sid

session.use_trans_sid 設定值

cache_limiter

session_cache_limiter設定值

cache_expire

session_cache_expire設定值

type

session hander型別,可以使用hander驅動擴充套件


Session初始化設定方法 無需手動呼叫,在App類的初始化工作結束後會自動呼叫,通常專案只需要配置SESSION_OPTIONS引數即可,SESSION_OPTIONS引數的設定是一個數組,支援的索引名和前面的session初始化引數相同。

預設情況下,初始化之後系統會自動啟動session,如果不希望系統自動啟動session的話,可以設定SESSION_AUTO_START為false,例如:
'SESSION_AUTO_START' =>false

關閉自動啟動後可以專案的公共檔案或者在控制器中通過手動呼叫session_start或者session('[start]') 啟動session。

session賦值

Session賦值比較簡單,直接使用:
session('name','value'); //設定session

相當於:
$_SESSION['name'] = 'value';

session取值

Session取值使用:
$value = session('name');


相當於使用:
$value = $_SESSION['name'];


session刪除

session('name',null); // 刪除name
相當於:
unset($_SESSION['name']);


要刪除所有的session,可以使用:
session(null); // 清空當前的session
相當於:
$_SESSION = array();

session判斷

要判斷一個session值是否已經設定,可以使用
session('?name');


用於判斷名稱為name的session值是否已經設定
相當於:
isset($_SESSION['name']);


session管理

session方法支援一些簡單的session管理操作,用法如下:

session('[操作名]');

支援的操作名包括:

操作名

含義

start

啟動session

pause

暫停session寫入

destroy

銷燬session

regenerate

重新生成session id


使用示例如下:
session('[pause]'); // 暫停session寫入
session('[start]'); // 啟動session
session('[destroy]'); // 銷燬session
session('[regenerate]'); // 重新生成session id

本地化支援

如果在初始化session設定的時候傳入prefix引數或者單獨設定了SESSION_PREFIX引數的話,就可以啟用本地化session管理支援。啟動本地化session後,所有的賦值、取值、刪除以及判斷操作都會自動支援本地化session。
本地化session支援開啟後,生成的session資料格式由原來的
$_SESSION['name'] 變成 $_SESSION['字首']['name']

假設字首設定為think,則

賦值操作:

session('name','value'); //設定session


相當於:
$_SESSION['think']['name'] = 'value';


取值操作:
$value = session('name');


相當於使用:
$value = $_SESSION['think']['name'];



刪除操作:
session('name',null);


相當於:
unset($_SESSION['think']['name']);



清空操作:

session(null); 
相當於:
unset($_SESSION['think']);



判斷操作:

session('?name');
相當於:
isset($_SESSION['think']['name']);


ThinkPHP函式詳解:cookie方法

cookie函式也是一個多元化操作函式,完成cookie的設定、獲取和刪除操作。

Cookie 用於Cookie 設定、獲取、刪除操作

用法

cookie($name, $value='', $option=null)

引數

name(必須):要操作的cookie變數value(可選):要設定的cookie值option(可選):傳入的cookie設定引數,預設為空

返回值

見詳(根據具體的用法返回不同的值)

Cookie設定

cookie('name','value'); //設定cookie
cookie('name','value',3600); // 指定cookie儲存時間



3.1版本開始,cookie方法增加對陣列的支援(採用輕量級的json編碼格式儲存 減少儲存空間),例如:[-more-]

cookie('name',array('name1','name2'));


還可以支援引數傳入的方式完成複雜的cookie賦值,下面是對cookie的值設定3600秒有效期,並且加上cookie字首think_
cookie('name','value',array('expire'=>3600,'prefix'=>'think_'))



陣列引數可以採用query形式引數
cookie('name','value','expire=3600&prefix=think_')


和上面的用法等效。

傳入的option引數支援prefix,expire,path,domain四個索引引數,如果沒有傳入或者傳入空值的話,會預設取COOKIE_PREFIX、COOKIE_EXPIRE、COOKIE_PATH和COOKIE_DOMAIN四個配置引數。如果只傳入個別引數,那麼也會和預設的配置引數合併。

Cookie獲取

獲取cookie很簡單,無論是怎麼設定的cookie,只需要使用:
$value = cookie('name');


如果沒有設定cookie字首的話 相當於
$value = $_COOKIE['name']


如果設定了cookie字首的話,相當於
$value = $_COOKIE['字首+name']


Cookie刪除

刪除某個cookie的值,使用:
cookie('name',null);


要刪除所有的Cookie值,可以使用
cookie(null); // 清空當前設定字首的所有cookie值
cookie(null,'think_'); // 清空指定字首的所有cookie值


ThinkPHP函式詳解:import方法

import方法是ThinkPHP框架用於類庫匯入的封裝實現,尤其對於專案類庫、擴充套件類庫和第三方類庫的匯入支援,import方法早期的版本可以和java的import方法一樣匯入目錄和萬用字元匯入,後來考慮到效能問題,在後續的版本更新中不斷改進和簡化了,所以現在的用法比較簡單明瞭。呼叫格式:

import('類庫名', '起始路徑', '類庫字尾')

imprt方法有一個別名vendor方法,專門用於匯入第三方類庫,區別在於起始路徑和類庫字尾預設值不同。

我們來分析下具體的用法:

匯入系統基類庫
系統基類庫其實就是指的Think類庫包,所在目錄就是指框架的核心Lib目錄,import方法可以用於匯入系統基類庫,例如:
import('Think.Util.Array');


表示匯入系統目錄下面的Lib/Util/Array.class.php 類庫檔案,相當於我們這樣使用
require THINK_PATH.'Lib/Util/Array.class.php';


可以支援多級目錄,例如:
import('Think.Util.U1.ClassA');
import('Think.Util.U1.A2.ClassB');


通過import方法匯入類庫後,就可以進行類庫的例項化操作