溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么在Thinkphp中正確的使用單字母函數(shù)

發(fā)布時間:2020-12-19 14:59:08 來源:億速云 閱讀:129 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章給大家介紹怎么在Thinkphp中正確的使用單字母函數(shù),內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

A方法

A方法用于在內(nèi)部實例化控制器,調(diào)用格式:A(‘[項目://][分組/]模塊','控制器層名稱')
最簡單的用法:

復(fù)制代碼 代碼如下:

$User = A('User');

表示實例化當前項目的UserAction控制器(這個控制器對應(yīng)的文件位于Lib/Action/UserAction.class.),如果采用了分組模式,并且要實例化另外一個Admin分組的控制器可以用:

復(fù)制代碼 代碼如下:

$User = A('Admin/User');

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

復(fù)制代碼 代碼如下:

$User = A('Admin://User');

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

復(fù)制代碼 代碼如下:

$User = A('User','Event);

實例化UserEvent控制器(對應(yīng)的文件位于Lib/Event/UserEvent.class.)。
實例化控制器后,就可以調(diào)用該控制器中的方法,不過需要注意的情況是,在跨項目調(diào)用的情況下,如果你的操作方法 有針對當前控制器的特殊變量操作,會有一些未知的問題,所以,一般來說,官方建議需要公共調(diào)用的控制器層單獨開發(fā),不要有太多的依賴關(guān)系。

B方法

這是隨著行為應(yīng)運而生的新生函數(shù),可以執(zhí)行某個行為,例如

復(fù)制代碼 代碼如下:

B('app_begin');


就是在項目開始之前,執(zhí)行這個行為定義的所有函數(shù)。支持2個參數(shù),第二個參數(shù)支持需要接受一個數(shù)組,例如

復(fù)制代碼 代碼如下:

B('app_begin',array("name"=& gt;"tdweb","time"=>time()));

C方法

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

復(fù)制代碼 代碼如下:

C('DB_NAME','think');


表示設(shè)置DB_NAME配置參數(shù)的值為think,由于配置參數(shù)不區(qū)分大小寫,所以下面的寫法也是一樣:

復(fù)制代碼 代碼如下:

C('db_name','think');


但是建議保持統(tǒng)一大寫的配置定義規(guī)范。
項目的所有參數(shù)在未生效之前都可以通過該方法動態(tài)改變配置,最后設(shè)置的值會覆蓋前面設(shè)置或者慣例配置里面的定義,也可以使用參數(shù)配置方法添加新的配置。
支持二級配置參數(shù)的設(shè)置,例如:

復(fù)制代碼 代碼如下:

C('USER.USER_ID',8);


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

復(fù)制代碼 代碼如下:

$config['user_id'] = 1;
$config['user_type'] = 1;
C($config);


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

復(fù)制代碼 代碼如下:

C('USER_ID',1);
C('USER_TYPE',1);


獲取參數(shù)
要獲取設(shè)置的參數(shù),可以用:

復(fù)制代碼 代碼如下:

$userId = C('USER_ID');
$userType = C('USER_TYPE');


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

復(fù)制代碼 代碼如下:

$userId = C('USER.USER_ID');


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

復(fù)制代碼 代碼如下:

$config = C();


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

復(fù)制代碼 代碼如下:

$config['user_id'] = 1;
$config['user_type'] = 1;
C($config,'name');


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

復(fù)制代碼 代碼如下:

$config = C('','name');


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

D方法

D方法應(yīng)該是用的比較多的方法了,用于實例化自定義模型類,是Think框架對Model類實例化的一種封裝,并實現(xiàn)了單例模式,支持跨項目和分組調(diào)用,調(diào)用格式如下:
D(‘[項目://][分組/]模型','模型層名稱')
方法的返回值是實例化的模型對象。
D方法可以自動檢測模型類,如果存在自定義的模型類,則實例化自定義模型類,如果不存在,則會實例化Model基類,同時對于已實例化過的模型,不會重復(fù)去實例化。
D方法最常用的用法就是實例化當前項目的某個自定義模型,例如:

復(fù)制代碼 代碼如下:

// 實例化User模型
$User = D('User');


會導(dǎo)入當前項目下面的Lib/Model/UserModel.class.文件,然后實例化UserModel類,所以,實際上的代碼可能和下面的等效:

復(fù)制代碼 代碼如下:

import('@.Model.UserModel');
$User = new UserModel();


但是如果使用D方法的話,如果這個UserModel類不存在,則會自動調(diào)用

復(fù)制代碼 代碼如下:

new Model('User');

并且第二次調(diào)用的時候無需再次實例化,可以減少一定的對象實例化開銷。
D方法可以支持跨分組和項目實例化模型,例如:

復(fù)制代碼 代碼如下:

//實例化Admin項目的User模型
D('Admin://User')
//實例化Admin分組的User模型
D('Admin/User')


注意:要實現(xiàn)跨項目調(diào)用模型的話,必須確保兩個項目的目錄結(jié)構(gòu)是并列的。
.1版本開始,由于增加了分層模型的支持,所以D方法也可以實例化其他的模型,例如:

復(fù)制代碼 代碼如下:

// 實例化UserService類
$User = D('User','Service');
// 實例化UserLogic類
$User = D('User','Logic');

復(fù)制代碼 代碼如下:

D('User','Service');


會導(dǎo)入Lib/Service/UserService.class.,并實例化,等效于下面的代碼:

復(fù)制代碼 代碼如下:

import('@.Service.UserService');
$User = new UserSerivce();

F方法

F方法其實是S方法的一個子集功能,僅用于簡單數(shù)據(jù)緩存,并且只能支持文件形式,不支持緩存有效期,因為采用的是返回方式,所以其效率較S方法較高,因此我們也稱之為快速緩存方法。

F方法的特點是:
簡單數(shù)據(jù)緩存;
文件形式保存;
采用返回數(shù)據(jù)方式加載緩存;
支持子目錄緩存以及自動創(chuàng)建;
支持刪除緩存和批量刪除;
寫入和讀取緩存

復(fù)制代碼 代碼如下:

F('data','test data');


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

復(fù)制代碼 代碼如下:

$Data = F('data');


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

復(fù)制代碼 代碼如下:

F('user/data',$data); // 緩存寫入
F('user/data'); // 讀取緩存


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

復(fù)制代碼 代碼如下:

F('level1/level2/data',$data);


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

復(fù)制代碼 代碼如下:

F('data',$data,TEMP_PATH);


獲取的時候則需要使用:

復(fù)制代碼 代碼如下:

F('data','',TEMP_PATH);


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

復(fù)制代碼 代碼如下:

F('data',NULL);


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

復(fù)制代碼 代碼如下:

F('user/*',NULL);


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

復(fù)制代碼 代碼如下:

F('user/[^a]*',NULL);

G方法

Thinkphp長期以來需要通過debug_start、debug_end方法甚至Debug類才能完成的功能,3.1版本中被一個簡單的G方法取代了,不可不謂是一次華麗升級。
G方法的作用包括標記位置和區(qū)間統(tǒng)計兩個功能,下面來看下具體用法:
標記位置
G方法的第一個用法就是標記位置,例如:

復(fù)制代碼 代碼如下:

G('begin');


表示把當前位置標記為begin標簽,并且記錄當前位置的執(zhí)行時間,如果環(huán)境支持的話,還能記錄內(nèi)存占用情況??梢栽谌魏挝恢谜{(diào)用G方法標記。
運行時間統(tǒng)計
標記位置后,我們就可以再次調(diào)用G方法進行區(qū)間統(tǒng)計了,例如:

復(fù)制代碼 代碼如下:

G('begin');
// ...其他代碼段
G('end');
// ...也許這里還有其他代碼
// 進行統(tǒng)計區(qū)間
echo G('begin','end').'s';


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

復(fù)制代碼 代碼如下:

0.0056s


默認的統(tǒng)計精度是小數(shù)點后4位,如果覺得這個統(tǒng)計精度不夠,還可以設(shè)置例如:

復(fù)制代碼 代碼如下:

G('begin','end',6).'s';


可能的輸出會變成:

復(fù)制代碼 代碼如下:

0.005587s


內(nèi)存開銷統(tǒng)計
如果你的環(huán)境支持內(nèi)存占用統(tǒng)計的話,還可以使用G方法進行區(qū)間內(nèi)存開銷統(tǒng)計(單位為kb),例如:

復(fù)制代碼 代碼如下:

echo G('begin','end','m').'kb';


第三個參數(shù)使用m表示進行內(nèi)存開銷統(tǒng)計,輸出的結(jié)果可能是:

復(fù)制代碼 代碼如下:

625kb


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

I方法

Thinkphp的I方法是3.1.3版本新增的,如果你是之前的3.*版本的話,可以直接參考使用3.1快速入門教程系列的變量部分。
概述
正如你所見到的一樣,I方法是Thinkphp眾多單字母函數(shù)中的新成員,其命名來自于英文Input(輸入),主要用于更加方便和安全的獲取系統(tǒng)輸入變量,可以用于任何地方,用法格式如下:
I(‘變量類型.變量名',[‘默認值'],[‘過濾方法'])
變量類型是指請求方式或者輸入類型,包括:
get 獲取GET參數(shù)
post 獲取POST參數(shù)
param 自動判斷請求類型獲取GET、POST或者PUT參數(shù)
request 獲取REQUEST 參數(shù)
put 獲取PUT 參數(shù)
session 獲取 $_SESSION 參數(shù)
cookie 獲取 $_COOKIE 參數(shù)
server 獲取 $_SERVER 參數(shù)
globals 獲取 $GLOBALS參數(shù)
注意:變量類型不區(qū)分大小寫。
變量名則嚴格區(qū)分大小寫。
默認值和過濾方法均屬于可選參數(shù)。
用法
我們以GET變量類型為例,說明下I方法的使用:

復(fù)制代碼 代碼如下:

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


支持默認值:

復(fù)制代碼 代碼如下:

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


采用方法過濾:

復(fù)制代碼 代碼如下:

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


支持直接獲取整個變量類型,例如:

復(fù)制代碼 代碼如下:

I('get.'); // 獲取整個$_GET 數(shù)組


用同樣的方式,我們可以獲取post或者其他輸入類型的變量,例如:

復(fù)制代碼 代碼如下:

1.I('post.name','','htmlspecialchars'); // 采用htmlspecialchars方法對$_POST['name'] 進行過濾,如果不存在則返回空字符串
I('session.user_id',0); // 獲取$_SESSION['user_id'] 如果不存在則默認為0
I('cookie.'); // 獲取整個 $_COOKIE 數(shù)組
I('server.REQUEST_METHOD'); // 獲取 $_SERVER['REQUEST_METHOD']


param變量類型是框架特有的支持自動判斷當前請求類型的變量獲取方式,例如:

復(fù)制代碼 代碼如下:

echo I('param.id');


如果當前請求類型是GET,那么等效于 GET[′id′],如果當前請求類型是POST或者PUT,那么相當于獲取_POST[‘id'] 或者 PUT參數(shù)id。
并且param類型變量還可以用數(shù)字索引的方式獲取URL參數(shù)(必須是PATHINFO模式參數(shù)有效,無論是GET還是POST方式都有效),例如:
當前訪問URL地址是

復(fù)制代碼 代碼如下:

http://serverName/index./New/2013/06/01


那么我們可以通過

復(fù)制代碼 代碼如下:

echo I('param.1'); // 輸出2013
echo I('param.2'); // 輸出06
echo I('param.3'); // 輸出01


事實上,param變量類型的寫法可以簡化為:

復(fù)制代碼 代碼如下:

I('id'); // 等同于 I('param.id')
I('name'); // 等同于 I('param.name')


變量過濾
使用I方法的時候 變量其實經(jīng)過了兩道過濾,首先是全局的過濾,全局過濾是通過配置VAR_FILTERS參數(shù),這里一定要注意,3.1版本之后,VAR_FILTERS參數(shù)的過濾機制已經(jīng)更改為采用array_walk_recursive方法遞歸過濾了,主要對過濾方法的要求是必須引用返回,所以這里設(shè)置htmlspecialchars是無效的,你可以自定義一個方法,例如:

復(fù)制代碼 代碼如下:

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


然后配置:

復(fù)制代碼 代碼如下:

'VAR_FILTERS'=>'filter_default'


如果需要進行多次過濾,可以用:

復(fù)制代碼 代碼如下:

'VAR_FILTERS'=>'filter_default,filter_exp'


filter_exp方法是框架內(nèi)置的安全過濾方法,用于防止利用模型的EXP功能進行注入攻擊。
因為VAR_FILTERS參數(shù)設(shè)置的是全局過濾機制,而且采用的是遞歸過濾,對效率有所影響,所以,我們更建議直接對獲取變量過濾的方式,除了在I方法的第三個參數(shù)設(shè)置過濾方法外,還可以采用配置DEFAULT_FILTER參數(shù)的方式設(shè)置過濾,事實上,該參數(shù)的默認設(shè)置是:

復(fù)制代碼 代碼如下:

'DEFAULT_FILTER'        => 'htmlspecialchars'


也就說,I方法的所有獲取變量都會進行htmlspecialchars過濾,那么:

復(fù)制代碼 代碼如下:

I('get.name'); // 等同于 htmlspecialchars($_GET['name'])


同樣,該參數(shù)也可以支持多個過濾,例如:

復(fù)制代碼 代碼如下:

'DEFAULT_FILTER'        => 'strip_tags,htmlspecialchars'

復(fù)制代碼 代碼如下:

I('get.name'); // 等同于 htmlspecialchars(strip_tags($_GET['name']))


如果我們在使用I方法的時候 指定了過濾方法,那么就會忽略DEFAULT_FILTER的設(shè)置,例如:

復(fù)制代碼 代碼如下:

echo I('get.name','','strip_tags'); // 等同于 strip_tags($_GET['name'])


I方法的第三個參數(shù)如果傳入函數(shù)名,則表示調(diào)用該函數(shù)對變量進行過濾并返回(在變量是數(shù)組的情況下自動使用array_map進行過濾處理),否則會調(diào)用內(nèi)置的filter_var方法進行過濾處理,例如:

復(fù)制代碼 代碼如下:

I('post.email','',FILTER_VALIDATE_EMAIL);


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

復(fù)制代碼 代碼如下:

I('post.email','','email');


可以支持的過濾名稱必須是filter_list方法中的有效值(不同的服務(wù)器環(huán)境可能有所不同),可能支持的包括:

復(fù)制代碼 代碼如下:

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已經(jīng)有所設(shè)置,可以使用:

復(fù)制代碼 代碼如下:

I('get.name','',NULL);


一旦過濾參數(shù)設(shè)置為NULL,即表示不再進行任何的過濾。

L方法

L方法用于啟用多語言的情況下,設(shè)置和獲取當前的語言定義。
調(diào)用格式:L(‘語言變量',[‘語言值'])
設(shè)置語言變量
除了使用語言包定義語言變量之外,我們可以用L方法動態(tài)設(shè)置語言變量,例如:

復(fù)制代碼 代碼如下:

L('LANG_VAR','語言定義');


語言定義不區(qū)分大小寫,所以下面也是等效的:

復(fù)制代碼 代碼如下:

L('lang_var','語言定義');


不過規(guī)范起見,我們建議統(tǒng)一采用大寫定義語言變量。
L方法支持批量設(shè)置語言變量,例如:

復(fù)制代碼 代碼如下:

$lang['lang_var1'] = '語言定義1';
$lang['lang_var2'] = '語言定義2';
$lang['lang_var3'] = '語言定義3';
L($lang);


表示同時設(shè)置3個語言變量lang_var1 lang_var2和lang_var3。
[-more-]
獲取語言變量

復(fù)制代碼 代碼如下:

$langVar = L('LANG_VAR');


或者:

復(fù)制代碼 代碼如下:

$langVar = L('lang_var');


如果參數(shù)為空,表示獲取當前定義的全部語言變量(包括語言定義文件中的):

復(fù)制代碼 代碼如下:

$lang = L();


或者我們也可以在模板中使用

復(fù)制代碼 代碼如下:

{$Think.lang.lang_var}


來輸出語言定義。

M方法

M方法用于實例化一個基礎(chǔ)模型類,和D方法的區(qū)別在于:
、不需要自定義模型類,減少IO加載,性能較好;
、實例化后只能調(diào)用基礎(chǔ)模型類(默認是Model類)中的方法;
、可以在實例化的時候指定表前綴、數(shù)據(jù)庫和數(shù)據(jù)庫的連接信息;
D方法的強大則體現(xiàn)在你封裝的自定義模型類有多強,不過隨著新版Think框架的基礎(chǔ)模型類的功能越來越強大,M方法也比D方法越來越實用了。
M方法的調(diào)用格式:
M(‘[基礎(chǔ)模型名:]模型名','數(shù)據(jù)表前綴','數(shù)據(jù)庫連接信息')
我們來看下M方法具體有哪些用法:
、實例化基礎(chǔ)模型(Model) 類
在沒有定義任何模型的時候,我們可以使用下面的方法實例化一個模型類來進行操作:

復(fù)制代碼 代碼如下:

//實例化User模型
$User = M('User');
//執(zhí)行其他的數(shù)據(jù)操作
$User->select();


這種方法最簡單高效,因為不需要定義任何的模型類,所以支持跨項目調(diào)用。缺點也是因為沒有自定義的模型類,因此無法寫入相關(guān)的業(yè)務(wù)邏輯,只能完成基本的CURD操作。

復(fù)制代碼 代碼如下:

$User = M('User');


其實等效于:

復(fù)制代碼 代碼如下:

$User = new Model('User');


表示操作think_user表。M方法和D方法一樣也有單例功能,多次調(diào)用并不會重復(fù)實例化。M方法的模型名參數(shù)在轉(zhuǎn)換成數(shù)據(jù)表的時候會自動轉(zhuǎn)換成小寫,也就是說Think的數(shù)據(jù)表命名規(guī)范是全小寫的格式。
、實例化其他公共模型類
第一種方式實例化因為沒有模型類的定義,因此很難封裝一些額外的邏輯方法,不過大多數(shù)情況下,也許只是需要擴展一些通用的邏輯,那么就可以嘗試下面一種方法。

復(fù)制代碼 代碼如下:

$User = M('CommonModel:User');


改用法其實等效于:

復(fù)制代碼 代碼如下:

$User = new CommonModel('User');

因為系統(tǒng)的模型類都能夠自動加載,因此我們不需要在實例化之前手動進行類庫導(dǎo)入操作。模型類CommonModel必須繼承Model。我們可以在CommonModel類里面定義一些通用的邏輯方法,就可以省去為每個數(shù)據(jù)表定義具體的模型類,如果你的項目已經(jīng)有超過100個數(shù)據(jù)表了,而大多數(shù)情況都是一些基本的CURD操作的話,只是個別模型有一些復(fù)雜的業(yè)務(wù)邏輯需要封裝,那么第一種方式和第二種方式的結(jié)合是一個不錯的選擇。

、傳入表前綴、數(shù)據(jù)庫和其他信息

M方法有三個參數(shù),第一個參數(shù)是模型名稱(可以包括基礎(chǔ)模型類和數(shù)據(jù)庫),第二個參數(shù)用于設(shè)置數(shù)據(jù)表的前綴(留空則取當前項目配置的表前綴),第三個參數(shù)用于設(shè)置當前使用的數(shù)據(jù)庫連接信息(留空則取當前項目配置的數(shù)據(jù)庫連接信息),例如:

復(fù)制代碼 代碼如下:

$User = M('db2.User','think_');


表示實例化Model模型類,并操作db2數(shù)據(jù)庫中的think_user表。
如果第二個參數(shù)留空或者不傳,表示使用當前項目配置中的數(shù)據(jù)表前綴,如果操作的數(shù)據(jù)表沒有表前綴,那么可以使用:

復(fù)制代碼 代碼如下:

$User = M('db1.User',null);


表示實例化Model模型類,并操作db1數(shù)據(jù)庫中的user表。
如果你操作的數(shù)據(jù)庫需要不同的用戶賬號,可以傳入數(shù)據(jù)庫的連接信息,例如:

復(fù)制代碼 代碼如下:

$User = M('User','think_','mysql://user_a:1234@localhost:3306/think');


表示基礎(chǔ)模型類用Model,然后對think_user表進行操作,用user_a賬號進行數(shù)據(jù)庫連接,操作數(shù)據(jù)庫是think。
第三個連接信息參數(shù)可以使用DSN配置或者數(shù)組配置,甚至可以支持配置參數(shù)。
例如,在項目配置文件中配置了:

復(fù)制代碼 代碼如下:

'DB_CONFIG'=>'mysql://user_a:1234@localhost:3306/think';


則可以使用:

復(fù)制代碼 代碼如下:

$User = M('User','think_','DB_CONFIG');


基礎(chǔ)模型類和數(shù)據(jù)庫可以一起使用,例如:

復(fù)制代碼 代碼如下:

$User = M('CommonModel:db2.User','think_');


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

復(fù)制代碼 代碼如下:

M('UserLogic:User');


來實例化UserLogic,雖然這樣做的意義不大,因為可以用

復(fù)制代碼 代碼如下:

D('User','Logic');


實現(xiàn)同樣的功能。

R方法

R方法用于調(diào)用某個控制器的操作方法,是A方法的進一步增強和補充。關(guān)于A方法的用法見這里。
R方法的調(diào)用格式:
R(‘[項目://][分組/]模塊/操作','參數(shù)','控制器層名稱')
例如,我們定義了一個操作方法為:

復(fù)制代碼 代碼如下:

class UserAction extends Action {
 public function detail($id){
     return M('User')->find($id);
 }
}


那么就可以通過R方法在其他控制器里面調(diào)用這個操作方法(一般R方法用于跨模塊調(diào)用)

復(fù)制代碼 代碼如下:

$data = R('User/detail',array('5'));


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

復(fù)制代碼 代碼如下:

$data = R('User/detail');


也可以支持跨分組和項目調(diào)用,例如:

復(fù)制代碼 代碼如下:

R('Admin/User/detail',array('5'));


表示調(diào)用Admin分組下面的User控制器的detail方法。

復(fù)制代碼 代碼如下:

R('Admin://User/detail',array('5'));


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

復(fù)制代碼 代碼如下:

class UserApi extends Action {
 public function detail($id){
     return M('User')->find($id);
 }
}

然后,使用R方法調(diào)用

復(fù)制代碼 代碼如下:


$data = R('User/detail',array('5'),'Api');

也就是說,R方法的第三個參數(shù)支持指定調(diào)用的控制器層。
同時,R方法調(diào)用操作方法的時候可以支持操作后綴設(shè)置C(‘ACTION_SUFFIX'),如果你設(shè)置了操作方法后綴,仍然不需要更改R方法的調(diào)用方式。

S方法

S方法還支持對當前的緩存方式傳入緩存參數(shù),例如:

復(fù)制代碼 代碼如下:


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


經(jīng)測試,這樣使用 只有前三個參數(shù)有效,后面的均無效

復(fù)制代碼 代碼如下:


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


最終這么用:

復(fù)制代碼 代碼如下:


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


獲取的時候:

復(fù)制代碼 代碼如下:


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

T方法

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

復(fù)制代碼 代碼如下:


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函數(shù):

復(fù)制代碼 代碼如下:


// 使用T函數(shù)輸出模板
$this->display(T('Admin@Public/menu'));


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

U方法

U方法用于完成對URL地址的組裝,特點在于可以自動根據(jù)當前的URL模式和設(shè)置生成對應(yīng)的URL地址,格式為:
U(‘地址','參數(shù)','偽靜態(tài)','是否跳轉(zhuǎn)','顯示域名');

在模板中使用U方法而不是固定寫死URL地址的好處在于,一旦你的環(huán)境變化或者參數(shù)設(shè)置改變,你不需要更改模板中的任何代碼。

在模板中的調(diào)用格式需要采用 {:U('地址', '參數(shù)'…)} 的方式

U方法的用法示例:

復(fù)制代碼 代碼如下:


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

也可以支持分組調(diào)用:

復(fù)制代碼 代碼如下:


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

當然,也可以只是寫操作名,表示調(diào)用當前模塊的

復(fù)制代碼 代碼如下:


U('add') // 生成當前訪問模塊的add操作地址

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

復(fù)制代碼 代碼如下:


U('Blog/readid=1') // 生成Blog模塊的read操作 并且id為1的URL地址

U方法的第二個參數(shù)支持傳入?yún)?shù),支持數(shù)組和字符串兩種定義方式,如果只是字符串方式的參數(shù)可以在第一個參數(shù)中定義,下面幾種方式都是等效的:

復(fù)制代碼 代碼如下:


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

但是不允許使用下面的定義方式來傳參數(shù):

復(fù)制代碼 代碼如下:


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

根據(jù)項目的不同URL設(shè)置,同樣的U方法調(diào)用可以智能地對應(yīng)產(chǎn)生不同的URL地址效果,例如針對:

復(fù)制代碼 代碼如下:


U('Blog/readid=1')

這個定義為例。
如果當前URL設(shè)置為普通模式的話,最后生成的URL地址是:

復(fù)制代碼 代碼如下:


http://serverName/index.m=Blog&a=read&id=1

如果當前URL設(shè)置為PATHINFO模式的話,同樣的方法最后生成的URL地址是: http://serverName/index./Blog/read/id/1
如果當前URL設(shè)置為REWRITE模式的話,同樣的方法最后生成的URL地址是: http://serverName/Blog/read/id/1
如果你同時還設(shè)置了PATHINFO分隔符的話:

復(fù)制代碼 代碼如下:


'URL_PATHINFO_DEPR'=>'_'

就會生成

復(fù)制代碼 代碼如下:


http://serverName/Blog_read_id_1

如果當前URL設(shè)置為REWRITE模式,并且設(shè)置了偽靜態(tài)后綴為html的話,同樣的方法最后生成的URL地址是:

復(fù)制代碼 代碼如下:


http://serverName/Blog/read/id/1.html

如果設(shè)置了多個偽靜態(tài)支持,那么會自動取第一個偽靜態(tài)后綴添加到URL地址后面,當然你也可以手動在U方法里面指定要生成的偽靜態(tài)后綴,例如:

復(fù)制代碼 代碼如下:


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

就會生成

復(fù)制代碼 代碼如下:


http://serverName/Blog/read/id/1.xml

U方法還可以支持路由,如果我們定義了一個路由規(guī)則為:

復(fù)制代碼 代碼如下:


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

那么可以使用

復(fù)制代碼 代碼如下:


U('/news/1')

最終生成的URL地址是:

復(fù)制代碼 代碼如下:


http://serverName/index./news/1

如果你的應(yīng)用涉及到多個子域名的操作地址,那么也可以在U方法里面指定需要生成地址的域名,例如:

復(fù)制代碼 代碼如下:


U('Blog/read@blog.think.cn','id=1');

@后面?zhèn)魅胄枰付ǖ挠蛎纯伞?br/>此外,U方法的第5個參數(shù)如果設(shè)置為true,表示自動識別當前的域名,并且會自動根據(jù)子域名部署設(shè)置APP_SUB_DOMAIN_DEPLOY和APP_SUB_DOMAIN_RULES自動匹配生成當前地址的子域名。
如果開啟了URL_CASE_INSENSITIVE,則會統(tǒng)一生成小寫的URL地址。

關(guān)于怎么在Thinkphp中正確的使用單字母函數(shù)就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI