搜尋
首頁後端開發php教程Thinkphp單字母函數使用指南_php技巧

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位址。

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
thinkphp是不是国产框架thinkphp是不是国产框架Sep 26, 2022 pm 05:11 PM

thinkphp是国产框架。ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,是为了简化企业级应用开发和敏捷WEB应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。

一起聊聊thinkphp6使用think-queue实现普通队列和延迟队列一起聊聊thinkphp6使用think-queue实现普通队列和延迟队列Apr 20, 2022 pm 01:07 PM

本篇文章给大家带来了关于thinkphp的相关知识,其中主要介绍了关于使用think-queue来实现普通队列和延迟队列的相关内容,think-queue是thinkphp官方提供的一个消息队列服务,下面一起来看一下,希望对大家有帮助。

thinkphp的mvc分别指什么thinkphp的mvc分别指什么Jun 21, 2022 am 11:11 AM

thinkphp基于的mvc分别是指:1、m是model的缩写,表示模型,用于数据处理;2、v是view的缩写,表示视图,由View类和模板文件组成;3、c是controller的缩写,表示控制器,用于逻辑处理。mvc设计模式是一种编程思想,是一种将应用程序的逻辑层和表现层进行分离的方法。

实例详解thinkphp6使用jwt认证实例详解thinkphp6使用jwt认证Jun 24, 2022 pm 12:57 PM

本篇文章给大家带来了关于thinkphp的相关知识,其中主要介绍了使用jwt认证的问题,下面一起来看一下,希望对大家有帮助。

thinkphp扩展插件有哪些thinkphp扩展插件有哪些Jun 13, 2022 pm 05:45 PM

thinkphp扩展有:1、think-migration,是一种数据库迁移工具;2、think-orm,是一种ORM类库扩展;3、think-oracle,是一种Oracle驱动扩展;4、think-mongo,一种MongoDb扩展;5、think-soar,一种SQL语句优化扩展;6、porter,一种数据库管理工具;7、tp-jwt-auth,一个jwt身份验证扩展包。

thinkphp 怎么查询库是否存在thinkphp 怎么查询库是否存在Dec 05, 2022 am 09:40 AM

thinkphp查询库是否存在的方法:1、打开相应的tp文件;2、通过“ $isTable=db()->query('SHOW TABLES LIKE '."'".$data['table_name']."'");if($isTable){...}else{...}”方式验证表是否存在即可。

一文教你ThinkPHP使用think-queue实现redis消息队列一文教你ThinkPHP使用think-queue实现redis消息队列Jun 28, 2022 pm 03:33 PM

本篇文章给大家带来了关于ThinkPHP的相关知识,其中主要整理了使用think-queue实现redis消息队列的相关问题,下面一起来看一下,希望对大家有帮助。

thinkphp3.2怎么关闭调试模式thinkphp3.2怎么关闭调试模式Apr 25, 2022 am 10:13 AM

在thinkphp3.2中,可以利用define关闭调试模式,该标签用于变量和常量的定义,将入口文件中定义调试模式设为FALSE即可,语法为“define('APP_DEBUG', false);”;开启调试模式将参数值设置为true即可。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。