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('ail','请输⼊正确的email地址',FILTER_VALIDATE_EMAIL);
表⽰会对$_POST['email']进⾏格式验证判断是否符合 email 的格式要求,如果不符合的话,返回提⽰信息。上⾯的代码也可以简化:
I('ail','请输⼊正确的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_rawthinkphp3
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强制转换为浮点类型