Thinkphp單字母函數使用指南_php技巧

WBOY
發布: 2016-05-16 09:00:20
原創
1825 人瀏覽過

A方法

A方法用於在內部實例化控制器,呼叫格式:A(‘[項目://][分組/]模組','控制器層名稱')
最簡單的用法:

複製程式碼 程式碼如下:
$User = A('User');

表示實例化目前專案的UserAction控制器(這個控制器對應的檔案位於Lib/Action/UserAction.class.),如果採用了分組模式,並且要實例化另一個Admin分組的控制器可用:

複製程式碼 程式碼如下:
$User = A('Admin/User'); div>

也支援跨專案實例化(專案的目錄要保持同級)

複製程式碼 程式碼如下:
$User = A('Admin://User');

表示實例化Admin專案下面的UserAction控制器
.1版本增加了分層控制器的支持,所以也可以用A方法實例化其他的控制器,例如:

複製程式碼 程式碼如下:
$User = A('User','Event);

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

B方法

這是隨著行為應運而生的新生函數,可以執行某個行為,例如

複製程式碼 程式碼如下:
B('app_begin');

就是在專案開始之前,執行這個行為定義的所有函數。支援2個參數,第二個參數支援需要接受一個數組,例如

複製程式碼 程式碼如下:
B('app_begin',array("name"=& gt ;"tdweb","time"=>time()));

C方法

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

複製程式碼 程式碼如下:
C('DB_NAME','think');

表示設定DB_NAME配置參數的值為think,由於設定參數不會區分大小寫,所以下面的寫法也是一樣:

複製程式碼 程式碼如下:
C('db_name','think');

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

複製程式碼 程式碼如下:
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'); div>
如果傳入的設定參數為空,表示取得全部的參數:

複製程式碼 程式碼如下:
$config = C();

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

複製程式碼 程式碼如下:
$config['user_id'] = 1;
$config['user_type'] = 1;
C($config,'name');

在批次設定了config參數後,會連同目前所有的設定參數儲存到快取檔案(或其他配置的快取方式)。
儲存之後,如果要取回已儲存的參數,可以用

複製程式碼 程式碼如下:
$config = C('','name');
其中name就是前面保存參數時所用的快取的標識,必須一致才能正確取回已儲存的參數。取回的參數會和目前的配置參數合併,無需手動合併。

D方法

D方法應該是用的比較多的方法了,用於實例化自定義模型類,是Think框架對Model類實例化的一種封裝,並實現了單例模式,支持跨項目和分組調用,呼叫格式如下:
D(‘[項目://][分組/]模型','模型層名稱')
方法的回傳值是實例化的模型物件。
D方法可以自動偵測模型類,如果存在自訂的模型類,則實例化自訂模型類,如果不存在,則會實例化Model基類,同時對於已實例化過的模型,不會重複去實例化。
D方法最常用的用法就是實例化目前專案的某個自訂模型,例如:

複製程式碼 程式碼如下:
// 實例化 User模型
$User = D('User');

會匯入目前專案下面的Lib/Model/UserModel.class.文件,然後實例化UserModel類,所以,實際上的程式碼可能和下面的等效:

複製程式碼 程式碼如下:
import('@.Model.UserModel');
$User = new UserModel();

但是如果使用D方法的話,如果這個UserModel類別不存在,則會自動呼叫

複製程式碼 程式碼如下:
new Model('User');

且第二次呼叫的時候無需再次實例化,可以減少一定的物件實例化開銷。
D方法可以支援跨分組和項目實例化模型,例如:

複製程式碼 程式碼如下:
//實例化Admin專案的User模型
D('Admin://User')
//實例化Admin分組的User模型
D('Admin/User')

注意:要實現跨項目呼叫模型的話,必須確保兩個項目的目錄結構是並列的。
.1版本開始,由於增加了分層模型的支持,因此D方法也可以實例化其他的模型,例如:

複製程式碼 程式碼如下:
// 實例化UserService類別
$User = D('User','Service');
// 實例化 UserLogic類別
$User = D('User','Logic');

複製程式碼 程式碼如下:
D('User','Service');

會導入Lib/Service/UserService.class.,並且實例化,等效於下面的程式碼:

複製程式碼 程式碼如下:
import('@.Service.UserService');
$User = new UserSerivce();

F方法

F方法其實是S方法的子集功能,只用於簡單資料緩存,只能支援檔案形式,不支援快取有效期,因為採用的是回傳方式,所以其效率較S方法較高,因此我們也稱之為快速快取方法。

F方法的特點是:
簡單資料緩存;
文件形式保存;
採用返回資料方式載入快取;
支援子目錄快取以及自動建立;
支援刪除快取和批次刪除;
寫入與讀取快取

複製程式碼 程式碼如下:
F('data','test data'); div>
預設的保存起始路徑是DATA_PATH(該常數在預設配置位於RUNTIME_PATH.'Data/'下面),也就是說會產生檔案名稱為DATA_PATH.'data.'的快取檔案。
注意:確保你的快取標識的唯一,避免資料覆蓋和衝突。
下次讀取快取資料的時候,使用:

複製程式碼 程式碼如下:
$Data = F('data');

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

複製程式碼 程式碼如下:
F('user/data',$data); //快取寫入
F('user/data'); // 讀取快取

就會產生DATA_PATH.'user/data.' 快取文件,如果user子目錄不存在的話,則會自動創建,也可以支援多層級子目錄,例如:

複製程式碼 程式碼如下:
F('level1/level2/data',$data);

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

複製程式碼 程式碼如下:
F('data',$data,TEMP_PATH); div>
取得的時候則需要使用:

複製程式碼 程式碼如下:
F('data','',TEMP_PATH); div>
刪除快取
刪除快取也很簡單,使用:

複製程式碼 程式碼如下:
F('data',NULL);
第二個參數傳入NULL,則表示刪除標識為data的資料快取。
支援批量刪除功能,尤其是針對子目錄快取的情況,假設我們要刪除user子目錄下面的所有快取數據,可以使用:

複製程式碼 程式碼如下:
F('user/*',NULL);

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

複製程式碼 程式碼如下:
F('user/[^a]*',NULL) ;

G方法

Thinkphp長期以來需要透過debug_start、debug_end方法甚至Debug類別才能完成的功能,3.1版本中被一個簡單的G方法取代了,不可不謂是一次華麗升級。
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吧,大道到簡,你懂的~

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或其他輸入類型的變量,例如:

複製程式碼 程式碼如下:
1.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./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'
    => 'strip_tags,htmlspecialchars'
    => 'strip_tags,htmlspecialchars'
    => 'strip_tags,htmlspecialchars'
    => 'strip_tags,htmlspecialchars'
    => '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進行過濾處理),否則會呼叫內建的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,即表示不再進行任何的過濾。

L方法

L方法用於啟用多語言的情況下,設定和取得目前的語言定義。
呼叫格式:L(‘語言變數',[‘語言值'])
設定語言變數
除了使用語言包定義語言變數之外,我們可以用L方法動態設定語言變量,例如:

複製程式碼 程式碼如下:
L('LANG_VAR','語言定義'); div>
語言定義不區分大小寫,所以下面也是等效的:

複製程式碼 程式碼如下:
L('lang_var','語言定義'); div>
不過規範起見,我們建議統一採用大寫定義語言變數。
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}

來輸出語言定義。

M方法

M方法用來實例化一個基礎模型類,和D方法的差別在於:
、不需要自訂模型類,減少IO加載,效能較好;
、實例化後只能呼叫基礎模型類別(預設是Model類別)中的方法;
、可以在實例化的時候指定表前綴、資料庫和資料庫的連接資訊;
D方法的強大則體現在你封裝的自訂模型類別有多強,不過隨著新版Think框架的基礎模型類別的功能越來越強大,M方法也比D方法越來越實用了。
M方法的呼叫格式:
M(‘[基礎模型名:]模型名稱','資料表前綴','資料庫連接資訊')
我們來看下M方法具體有哪些用法:
、實例化基礎模型(Model) 類別
在沒有定義任何模型的時候,我們可以使用下面的方法實例化一個模型類別來進行操作:

複製程式碼 程式碼如下:
//實例化User模型
$User = M('User');
//執行其他的資料操作
$User->select();

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

複製程式碼 程式碼如下:
$User = M('User');

其實等效於:

複製程式碼 程式碼如下:
$User = new Model('User');

表示操作think_user表。 M方法和D方法一樣也有單例功能,多次呼叫並不會重複實例化。 M方法的模型名參數在轉換成資料表的時候會自動轉換成小寫,也就是說Think的資料表命名規格是全小寫的格式。
、實例化其他公共模型類別
第一種方式實例化因為沒有模型類別的定義,因此很難封裝一些額外的邏輯方法,不過大多數情況下,也許只是需要擴展一些通用的邏輯,那麼就可以嘗試下面一種方法。

複製程式碼 程式碼如下:
$User = M('CommonModel:User'); div>
改用法其實等效於:

複製程式碼 程式碼如下:
$User = new CommonModel('User');

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

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

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/think');

表示基礎模型類別用Model,然後對think_user表進行操作,用user_a帳號進行資料庫連接,操作資料庫是think。
第三個連接資訊參數可以使用DSN配置或陣列配置,甚至可以支援配置參數。
例如,在專案設定檔中配置了:

複製程式碼 程式碼如下:
'DB_CONFIG'=>'mysql://user_a:1234@ localhost:3306/think';

則可以使用:

複製程式碼 程式碼如下:
$User = M('User','think_',' DB_CONFIG');

基礎模型類別和資料庫可以一起使用,例如:

複製程式碼 程式碼如下:
$User = M('CommonModel:db2.User',' think_');

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

複製程式碼 程式碼如下:
M('UserLogic:User');
來實例化UserLogic,雖然這樣做的意義不大,因為可以用

複製程式碼 程式碼如下:
D('User','Logic');

實現同樣的功能。

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'); div>
也可以支援跨分組和項目調用,例如:

複製程式碼 程式碼如下:
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方法的呼叫方式。

S方法

S方法也支援對目前的快取方式傳入快取參數,例如:

複製代碼 代碼如下:

S('data',$Data,3600,'File',array('length'=>10,'temp'=>RUNTIME_PATH.'temp/'));

經測試,這樣使用 只有前三個參數有效,後面的均無效
複製代碼 代碼如下:

{ 'File',array('length'=>10,'temp'=>RUNTIME_PATH.'temp/')}

最終這麼用:
複製代碼 代碼如下:

S('data1',$list,array('prefix'=>aaa','expire'=>'3600','temp'=>RUNTIME_PATH.'temp/1236'));

取得的時候:
複製代碼 代碼如下:

$sdata = S('data1','',array('prefix'=>'aaa','temp'=>RUNTIME_PATH.'temp/1236'));

T方法

為了更方便的輸出範本文件,新版封裝了一個T函數用來產生範本文件名稱。
用法:
T([資源://][模組@][主題/][控制器/]操作,[視圖分層])
T函數的回傳值是一個完整的模板檔名,可以直接用於display和fetch方法進行渲染輸出。
例如:

複製代碼 程式碼如下:

T('Public/menu');
// 回傳 目前模組/View/Public/menu.html
T('blue/Public/menu');
// 返回 目前模組/View/blue/Public/menu.html
T('Public/menu','Tpl');
// 返回 目前模組/Tpl/Public/menu.html
T('Public/menu');
// 如果TMPL_FILE_DEPR 為 _ 傳回 目前模組/Tpl/Public_menu.html
T('Public/menu');
// 如果TMPL_TEMPLATE_SUFFIX 為.tpl 傳回 目前模組/Tpl/Public/menu.tpl
T('Admin@Public/menu');
// 回傳 Admin/View/Public/menu.html
T('Extend://Admin@Public/menu');
// 回傳 Extend/Admin/View/Public/menu.html (Extend目錄取決於AUTOLOAD_NAMESPACE中的設定)

在display方法中直接使用T函數:
複製代碼 代碼如下:

// 使用T函數輸出範本
$this->display(T('Admin@Public/menu'));

T函數可以輸出不同的視圖分層模板。

U方法

U方法用於完成URL位址的組裝,特點在於可以自動根據目前的URL模式和設定產生對應的URL位址,格式為:
U(‘地址','參數','偽靜態','是否跳轉','顯示網域名稱');

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

在範本中的呼叫格式需要採用 {:U('位址', '參數'…)} 的方式

U方法的用法範例:

複製程式碼 程式碼如下:

U('User/add') // 產生User模組的add操作位址

也可以支援分組呼叫:

複製代碼 代碼如下:

U('Home/User/add') // 產生Home分組的User模組的add操作位址

當然,也可以只是寫操作名,表示呼叫目前模組的

複製程式碼 程式碼如下:

U('add') // 產生目前存取模組的add操作位址

除了分組、模組和操作名之外,我們也可以傳入一些參數:

複製程式碼 程式碼如下:

U('Blog/readid=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/catecate_id=1&status=1')

但是不允許使用下面的定義方式來傳送參數:

複製程式碼 程式碼如下:

U('Blog/cate/cate_id/1/status/1')

根據專案的不同URL設置,同樣的U方法呼叫可以智慧地對應產生不同的URL位址效果,例如針對:

複製程式碼 程式碼如下:

U('Blog/readid=1')

這個定義為例。
如果目前URL設定為普通模式的話,最後產生的URL位址是:

複製程式碼 程式碼如下:

如果目前URL設定為PATHINFO模式的話,同樣的方法最後產生的URL位址是: http://serverName /index./Blog/read/id/1
如果目前URL設定為REWRITE模式的話,同樣的方法最後產生的URL位址是: http://serverName/Blog/read/id /1
如果你同時也設定了PATHINFO分隔符號的話:

複製程式碼 程式碼如下:

'URL_PATHINFO_DEPR'=>'_'

就會產生

複製程式碼 程式碼如下:

如果目前URL設定為REWRITE模式,並且設定了偽靜態後綴為html的話,同樣的方法最後產生的URL位址是:

複製程式碼 程式碼如下:

如果設定了多個偽靜態支持,那麼會自動取第一個偽靜態後綴加到URL位址後面,當然你也可以手動在U方法裡面指定要產生的偽靜態後綴,例如:

複製程式碼 程式碼如下:

U('Blog/read','id=1','xml')

就會產生

複製程式碼 程式碼如下:

U方法也可以支援路由,如果我們定義了一個路由規則為:

複製程式碼 程式碼如下:

'news/:id\d'=>'News/read'

那麼可以使用

複製程式碼 程式碼如下:

U('/news/1')

最終產生的URL位址是:

複製程式碼 程式碼如下:

如果你的應用程式涉及到多個子域名的操作位址,那麼也可以在U方法裡面指定需要產生位址的域名,例如:

複製程式碼 程式碼如下:

@後面傳入需要指定的網域名稱即可。
此外,U方法的第5個參數如果設為true,表示自動識別目前的域名,並且會自動根據子網域部署設定APP_SUB_DOMAIN_DEPLOY和APP_SUB_DOMAIN_RULES自動比對產生目前位址的子網域。
如果開啟了URL_CASE_INSENSITIVE,則會統一產生小寫的URL位址。

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