zoukankan      html  css  js  c++  java
  • 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 强制转换为浮点类型



    突破传统的上网方式,不用记网址、不用搜索引擎,输入一两个字母就能迅速打开你想访问的任何网站——小笨猪网址索引
  • 相关阅读:
    纸牌排序
    将年份转换成天干地支
    猜算式
    字符串的简单处理
    九宫格填数字
    扫雷
    嗨喽
    Input.GetAxis与Input.GetAxisRaw区别
    C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别
    开发游戏所需知识(知乎转载)
  • 原文地址:https://www.cnblogs.com/programs/p/5490151.html
Copyright © 2011-2022 走看看