Thinkphp中的 I 函數(Thinkphp3.2.3版本)


I 函數的作用是獲取系統變量,必要時還可以對變量值進行過濾及強制轉化,I 函數的語法格式:

I('變量類型.變量名/修飾符',['默認值'],['過濾方法或正則'],['額外數據源'])

 

一、獲取變量

在PHP中獲取變量值的方法有很多,比如:$_GET['變量名'],$_POST['變量名'],$_SESSION['變量名'],$_COOKIE['變量名'],$_SERVER['變量名'] 都可以獲取相應的變量值,但在thinkphp中為了安全的原因建議統一使用 I 函數來獲取變量值。例如:獲取 URL 地址欄中參數 id 的值,在php中我們用 $_GET['id'] 來獲取,在thinkphp中我們可以用 I('get.id') 來獲取。同樣的, $_POST['id'] 就用 I('post.id') 取代,I 函數的語法格式中的變量類型就是指的像 get 和 post 之類的請求方式,類似的變量類型還包括:

變量類型 含義
get 獲取GET參數
post 獲取POST參數
param 自動判斷請求類型獲取GET、POST或者PUT參數
request 獲取REQUEST 參數
put 獲取PUT 參數
session 獲取 $_SESSION 參數
cookie 獲取 $_COOKIE 參數
server 獲取 $_SERVER 參數
globals 獲取 $GLOBALS參數
path 獲取 PATHINFO模式的URL參數
data 獲取 其他類型的參數,需要配合額外數據源參數

如果要獲取的變量類型是get、post 或 put,可以統一用 param 變量類型,param 變量類型是框架特有的支持自動判斷當前請求類型的變量獲取方式,例如:I('param.id') ,如果當前請求類型是GET,那么等效於 $_GET['id'],如果當前請求類型是POST或者PUT,那么相當於獲取 $_POST['id'] 或者 PUT參數id。而事實上當 I 函數獲取的變量類型是param時變量類型可以省略直接寫為:I('變量名') ,那么 $_GET['id']、$_POST['id'] 都可以簡寫為:I('id') 。但當變量類型為其他類型時就不能這么簡寫,比如 I('cookie.id')、I('session.id')就不能簡寫。

注意:I 函數的變量類型不區分大小寫,但變量名嚴格區分大小寫,比如 I('get.id') 可以寫成 I('GET.id'),但不能寫成 I('get.ID')

 

二、變量過濾

I 函數本身默認的過濾機制是 htmlspecialchars,因為在配置文件中配置了:

// 系統默認的變量過濾機制
'DEFAULT_FILTER'        => 'htmlspecialchars'

所以 I('post.變量名') 就等同於 htmlspecialchars($_POST('變量名')),如果 I 函數自身帶了過濾方法,則用自身帶的過濾機制過濾變量,比如:

I('post.email','請輸入正確的email地址',FILTER_VALIDATE_EMAIL);

表示會對$_POST['email'] 進行格式驗證判斷是否符合 email 的格式要求,如果不符合的話,返回提示信息。上面的代碼也可以簡化:

I('post.email','請輸入正確的email地址','email')

請注意,上面的 FILTER_VALIDATE_EMAIL 是不帶引號的,下面的 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

但我發現用簡寫的過濾名有時也會出現問題,我在我的筆記本上測試 print_r(filter_list()) 是包含 email 的,但 I('email','請輸入正確的email地址','email') 卻不能正確判斷,改成 I('email','請輸入正確的email地址',FILTER_VALIDATE_EMAIL) 就沒問題。 

I 函數的過濾方法也能支持正則表達式,如果要過濾的方法比較復制的話可以考慮使用正則表達式。在有些特殊的情況下,我們不希望進行任何過濾,即使DEFAULT_FILTER已經有所設置,可以使用:

// 下面兩種方式都不采用任何過濾方法
I('get.name','','');
I('get.id','',false);

 

三、變量修飾符

變量修飾符和變量名稱之間用“/”分割開來,變量修飾符的作用是強制轉化變量的字符類型,比如:

I('get.id/d'); // 強制變量轉換為整型
I('post.name/s'); // 強制轉換變量為字符串類型
I('post.ids/a'); // 強制變量轉換為數組類型

可以使用的修飾符包括:

修飾符 作用
s 強制轉換為字符串類型
d 強制轉換為整型類型
b 強制轉換為布爾類型
a 強制轉換為數組類型
f 強制轉換為浮點類型


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM