TP單字母函數

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)。
實例化控制器后,就可以調用該控制器中的方法,不過需要注意的情況是,在跨項目調用的情況下,如果你的操作方法 有針對當前控制器的特殊變量操作,會有一些未知的問題,所以,一般來說,官方建議需要公共調用的控制器層單獨開發,不要有太多的依賴關系。


B方法

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

B('app_begin');

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

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

C方法

C方法是ThinkPHP用于設置、獲取,以及保存配置參數的方法,使用頻率較高。

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

設置參數
C('DB_NAME','thinkphp');

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

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);
獲取參數

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

$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就是前面保存參數時用的緩存的標識,必須一致才能正確取回保存的參數。取回的參數會和當前的配置參數合并,無需手動合并。


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

F方法

F方法是S方法的一個子集功能,僅用于簡單數據緩存

我們已經了解了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);

G方法

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

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]POSTPUT

_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方法中的有效值(不同的服務器環境可能有所不同),可能支持的包括:

intbooleanfloat
validate_regexp
validate_url
validate_email
validate_ipstring
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','語言定義');

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

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。

獲取語言變量
$langVar = L('LANG_VAR');

或者:

$langVar = L('lang_var');

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

$lang = L();

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

{$Think.lang.lang_var}

來輸出語言定義。


M方法

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:1234@localhost:3306/thinkphp')

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

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

則可以使用:

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

基礎模型類和數據庫可以一起使用,例如:

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

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

M('UserLogic:User');

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

D('User','Logic');

實現同樣的功能。


N方法

N方法屬于計數器方法

被用于核心的查詢、緩存統計的計數和統計。但是其實可以用于應用的其他計數用途,用法比較簡單,調用格式:
N(‘計數位置’[,’步進值’])
例如,我們要統計頁面中的查詢次數,可以用

N('read',1);

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

$count = N('read');

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

N('score',5);

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


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方法的調用方式。


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([資源://][模塊@][主題/][控制器/]操作,[視圖分層])
T函數的返回值是一個完整的模板文件名,可以直接用于display和fetch方法進行渲染輸出。

例如:

T('Public/menu');// 返回 當前模塊/View/Public/menu.htmlT('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地址的組裝

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/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/read@blog.thinkphp.cn','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#comment@blog','id=1');

轉載于:https://www.cnblogs.com/baobaoa/p/9246840.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/390182.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/390182.shtml
英文地址,請注明出處:http://en.pswp.cn/news/390182.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Angular問題03 @angular/material版本問題

1 問題描述 應用使用 angular4在使用angular/material時,若果在導入模塊時使用mat開頭,就會報錯。 2 問題原因 angular/material版本出現問題,angular/material 從版本5開始就必須要angular5的核心依賴;想要在angular5之前版本中的…

onclick判斷組件調用_從子組件Onclick更新狀態

onclick判斷組件調用How to update the state of a parent component from a child component is one of the most commonly asked React questions.如何從子組件更新父組件的狀態是最常見的React問題之一。 Imagine youre trying to write a simple recipe box application, …

Python 列表List的定義及操作

# 列表概念:有序的可變的元素集合# 定義 # 直接定義 nums [1,2,3,4,5]# 通過range函數構造,python2 和python3 版本之間的差異; # python3 用的時候才會去構造 nums range(1,101)# 列表嵌套 # 注意和C語言中數組的區別,是否可…

遞歸分解因數

題目總時間限制: 1000ms 內存限制: 65536kB描述給出一個正整數a&#xff0c;要求分解成若干個正整數的乘積&#xff0c;即a a1 * a2 * a3 * ... * an&#xff0c;并且1 < a1 < a2 < a3 < ... < an&#xff0c;問這樣的分解的種數有多少。注意到a a也是一種分解…

劍指 Offer 51. 數組中的逆序對

劍指 Offer 51. 數組中的逆序對 在數組中的兩個數字&#xff0c;如果前面一個數字大于后面的數字&#xff0c;則這兩個數字組成一個逆序對。輸入一個數組&#xff0c;求出這個數組中的逆序對的總數。 示例 1: 輸入: [7,5,6,4] 輸出: 5 限制&#xff1a; 0 < 數組長度 &…

react 圖像識別_無法在React中基于URL查找圖像

react 圖像識別If youre new to React and are having trouble accessing images stored locally, youre not alone.如果您不熟悉React&#xff0c;并且無法訪問本地存儲的圖像&#xff0c;那么您并不孤單。 Imagine you have your images stored in a directory next to a co…

html單行元素居中顯示,多行元素居左顯示

有很多的業務需要元素或者文字如果單行&#xff0c;居中顯示&#xff0c;如果數據增多&#xff0c;居中顯示代碼&#xff08;直接復制到編輯器可用&#xff09;&#xff1a;<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8&q…

ML.NET 0.2版增加了集群和新示例

在今年的Build大會上&#xff0c;微軟首次發布了ML.NET。ML.NET是開源的、跨平臺的以及運行在.NET上的機器學習框架。微軟的Ankit Asthana宣布該項目已經完成了第二版的開發。第二版增加了幾個新功能&#xff0c;包括名為集群的新機器學習任務&#xff0c;交叉驗證和訓練-測試&…

如何變得井井有條-來之不易的秘訣來組織您的生活

Because of the changes brought about by COVID-19, many people have had to find healthy and productive ways of working remotely. 由于COVID-19帶來的變化&#xff0c;許多人不得不尋找健康有效的遠程工作方式。 Some have been sent home and can continue doing thei…

被未知進程占用端口的解決辦法

echo off echo 這是用來結束一個未知進程占用端口的批處理可執行文件ipconfig /allnetstat -anoecho 請查看以上信息&#xff0c;輸入被占用的端口號:set /p port請輸入port:tasklist|findstr %port%echo 請結合上述程序進行輸入&#xff0c;請**謹慎輸入**set /p program請輸入…

怎樣在減少數據中心成本的同時不犧牲性能?

2019獨角獸企業重金招聘Python工程師標準>>> 導讀雖然組織對數據中心提出了更高的要求&#xff0c;但IT管理人員確實有辦法在嚴格的預算內展開工作。如今&#xff0c;組織認為即使性能預期不斷提高&#xff0c;其數據中心預算也在縮減。盡管2018年IT支出總體預計增長…

賽普拉斯 12864_如何使用賽普拉斯自動化輔助功能測試

賽普拉斯 12864In my previous post, I covered how to add screenshot testing in Cypress to ensure components dont unintentionally change over time. 在上一篇文章中 &#xff0c;我介紹了如何在賽普拉斯中添加屏幕截圖測試&#xff0c;以確保組件不會隨時間變化。 Now…

anaconda在win下和在mac下的安裝區別

1. 在win下安裝anaconda后會提示你選擇環境變量&#xff0c;但是建議使用默認。 于是CMD進入終端和使用navigator進入終端不一樣&#xff0c;前者會提示無此命令&#xff0c;只能通過navigator進入終端 即使在系統變量變量Path里添加了路徑&#xff0c;使用CMD還是不能使用pyth…

fcn從頭開始_如何使用Go從頭開始構建區塊鏈

fcn從頭開始介紹 (Introduction) With Web 3.0 and blockchain becoming more mainstream every day, do you know what blockchain is? Do you know its technical advantages and use-cases?隨著Web 3.0和區塊鏈每天變得越來越主流&#xff0c;您知道什么是區塊鏈嗎&#x…

java實現無序數組結構

一、數組的2種定義方式 數據類型 [] 數組名稱 new 數據類型[數組長度]; 這里 [] 可以放在數組名稱的前面&#xff0c;也可以放在數組名稱的后面&#xff0c;一般放在名稱的前面 數據類型 [] 數組名稱 {數組元素1&#xff0c;數組元素2&#xff0c;......} 這種方式聲明數組的…

Android App 的主角:Activity

Android App 程序主要由4種類型組成&#xff1a; 1.Activity&#xff08;活動&#xff09;&#xff1a;主要負責屏幕顯示畫面&#xff0c;并處理與用戶的互動。每個Android App至少都會有一個Activity&#xff0c;在程序一啟動時顯示主畫面供用戶操作。 2.Service&#xff08;后…

通過構建Paint App學習React Hooks

According to people in the know, React Hooks are hot, hot, hot. In this article, we follow Christian Jensens 14-part tutorial to find out about the basics of this new feature of React. Follow along to find out more! 據知情人士稱&#xff0c;React Hooks很熱&…

正則表達式 匹配常用手機號 (13、15\17\18開頭的十一位手機號)

原文:正則表達式 匹配常用手機號 &#xff08;13、15\17\18開頭的十一位手機號&#xff09;^1[3578]\d{9}$ ^1表示以1開頭&#xff0c;[3578]表示第二位的數字為3578中的任意一個&#xff0c;\d{9}表示0~9范圍內的數字匹配九次,$表示結束&#xff0c;12位以上的數字不匹配。

Npoi導出excel整理(附源碼)

前些日子做了一個簡單的winform程序&#xff0c;需要導出的功能&#xff0c;剛開始省事直接使用微軟的組件&#xff0c;但是導出之后發現效率極其低下&#xff0c;絕對像web那樣使用npoi組件&#xff0c;因此簡單的進行了整理&#xff0c;包括直接根據DataTable導出excel及Data…

44. 通配符匹配

44. 通配符匹配 給定一個字符串 (s) 和一個字符模式 &#xff0c;實現一個支持 ‘?’ 和 ‘*’ 的通配符匹配。 ? 可以匹配任何單個字符。 * 可以匹配任意字符串&#xff08;包括空字符串&#xff09;。 兩個字符串完全匹配才算匹配成功。說明: s 可能為空&#xff0c;且…