I 函數的做用是獲取系統變量,必要時還能夠對變量值進行過濾及強制轉化,I 函數的語法格式:php
I('變量類型.變量名/修飾符',['默認值'],['過濾方法或正則'],['額外數據源'])
1、獲取變量html
在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')就不能簡寫。thinkphp
注意:I 函數的變量類型不區分大小寫,但變量名嚴格區分大小寫,好比 I('get.id') 能夠寫成 I('GET.id'),但不能寫成 I('get.ID')數組
2、變量過濾安全
I 函數自己默認的過濾機制是 htmlspecialchars,由於在配置文件中配置了:服務器
// 系統默認的變量過濾機制 'DEFAULT_FILTER' => 'htmlspecialchars'
因此 I('post.變量名') 就等同於 htmlspecialchars($_POST('變量名')),若是 I 函數自身帶了過濾方法,則用自身帶的過濾機制過濾變量,好比:cookie
I('post.email','請輸入正確的email地址',FILTER_VALIDATE_EMAIL);
表示會對$_POST['email']
進行格式驗證判斷是否符合 email 的格式要求,若是不符合的話,返回提示信息。上面的代碼也能夠簡化:session
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);
3、變量修飾符
變量修飾符和變量名稱之間用「/」分割開來,變量修飾符的做用是強制轉化變量的字符類型,好比:
I('get.id/d'); // 強制變量轉換爲整型 I('post.name/s'); // 強制轉換變量爲字符串類型 I('post.ids/a'); // 強制變量轉換爲數組類型
可使用的修飾符包括:
修飾符 | 做用 |
---|---|
s | 強制轉換爲字符串類型 |
d | 強制轉換爲整型類型 |
b | 強制轉換爲布爾類型 |
a | 強制轉換爲數組類型 |
f | 強制轉換爲浮點類型 |