您的位置:首页 > 编程语言 > PHP开发

ThinkPHP源码学习之I方法

2015-09-05 09:53 543 查看
PHP新人一个,最近在做一个项目,用的是ThinkPHP,想往深处学习,特意学习ThinkPHP的源码并作笔记,以记录这些容易忘记的东西,废话不多说,开始。

官网说明:

I方法是ThinkPHP众多单字母函数中的新成员,其命名来自于英文Input(输入),主要用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:

I('变量类型.变量名',['默认值'],['过滤方法'])
变量类型是指请求方式或者输入类型,包括:

变量类型含义
get获取GET参数
post获取POST参数
param自动判断请求类型获取GET、POST或者PUT参数
request获取REQUEST 参数
put获取PUT 参数
session获取 $_SESSION 参数
cookie获取 $_COOKIE 参数
server获取 $_SERVER 参数
globals获取 $GLOBALS参数
注意:变量类型不区分大小写。

变量名则严格区分大小写。

默认值和过滤方法均属于可选参数。

官方的代码如下:
function I($name,$default='',$filter=null,$datas=null) {
static $_PUT
= null;//使用static定义了一个静态,声明类成员或方法为static,就可以不实例化类而直接访问。不能通过一个对象来访问其中的静态成员(静态方法除外)
if(strpos($name,'/')){ //
指定修饰符 strpos()函数为查找字符串在另一个字符串中第一次出现的位置,查找‘/'在参数nam中第一次出现的位置
list($name,$type)
= explode('/',$name,2);//explode(separator,string,limit)函数意义为根据特定字符将字符串打撒为数组,limit为返回的数组的个数
}elseif(C('VAR_AUTO_STRING')){ // 默认强制转换为字符串 //调用了ThinkPHP的C方法

        $type   =   's';

    }

//小结  此if含义为判断参数是否带有/

    if(strpos($name,'.')) { // 指定参数来源 //查看是否带.!

        list($method,$name) =   explode('.',$name,2);

    }else{ // 默认为自动判断

        $method =   'param';

    }

    switch(strtolower($method)) {  //strtolower()把所有字符转换为小写 利用switch来定位方法的类型

        case 'get'     :   

        $input =& $_GET;

        break;

        case 'post'    :   

        $input =& $_POST;

        break;

        case 'put'     :   

        if(is_null($_PUT)){

            parse_str(file_get_contents('php://input'), $_PUT);

        }

        $input
= $_PUT;        

        break;

        case 'param'   :

            switch($_SERVER['REQUEST_METHOD']) {  //$_SERVER['REQUEST_METHOD' 获取请求的方法 利用获取到的方法名,使用swith()来定位方法的类型,此处思想为递归

                case 'POST':

                    $input  =  $_POST;

                    break;

                case 'PUT':

                if(is_null($_PUT)){

                    parse_str(file_get_contents('php://input'), $_PUT);

                }

                $input
= $_PUT;

                    break;

                default:

                    $input  =  $_GET;

            }

            break;

        case 'path'    :   

            $input  =   array();

            if(!empty($_SERVER['PATH_INFO'])){

                $depr   =   C('URL_PATHINFO_DEPR');

                $input  =   explode($depr,trim($_SERVER['PATH_INFO'],$depr));            

            }

            break;

        case 'request' :   

        $input =& $_REQUEST;   

        break;

        case 'session' :   

        $input =& $_SESSION;   

        break;

        case 'cookie'  :   

        $input =& $_COOKIE;    

        break;

        case 'server'  :   

        $input =& $_SERVER;    

        break;

        case 'globals' :   

        $input =& $GLOBALS;    

        break;

        case 'data'    :   

        $input =& $datas;      

        break;

        default:

            return null;

    }

    if(''==$name) { // 获取全部变量

        $data       =   $input;

        $filters    =   isset($filter)?$filter:C('DEFAULT_FILTER');//使用了三目运算符 isset()函数 一般用来检测变量是否设置,empty()用来判断是否为空

        if($filters) {

            if(is_string($filters)){

                $filters    =   explode(',',$filters);

            }

            foreach($filters as $filter){

                $data   =   array_map_recursive($filter,$data); // ThinkPHP的参数过滤方法array_map_recursive foreach()为循环函数

            }

        }

    }elseif(isset($input[$name])) { // 取值操作

        $data       =   $input[$name];

        $filters    =   isset($filter)?$filter:C('DEFAULT_FILTER');

        if($filters) {

            if(is_string($filters)){

                if(0 === strpos($filters,'/')){

                    if(1 !== preg_match($filters,(string)$data)){ //preg_match()用来匹配正则表达式

                        // 支持正则验证

                        return   isset($default) ? $default : null;

                    }

                }else{

                    $filters    =   explode(',',$filters);                    

                }

            }elseif(is_int($filters)){

                $filters    =   array($filters);

            }

            

            if(is_array($filters)){

                foreach($filters as $filter){

                    if(function_exists($filter)) {

                        $data   =   is_array($data) ? array_map_recursive($filter,$data) : $filter($data); // 参数过滤

                    }else{

                        $data   =   filter_var($data,is_int($filter) ? $filter : filter_id($filter));

                        if(false === $data) {

                            return   isset($default) ? $default : null;

                        }

                    }

                }

            }

        }

        if(!empty($type)){//使用switch判断type的类型

        switch(strtolower($type)){

        case 'a':
// 数组

        $data
= (array)$data;

        break;

        case 'd':
// 数字

        $data
= (int)$data;

        break;

        case 'f':
// 浮点

        $data
= (float)$data;

        break;

        case 'b':
// 布尔

        $data
= (boolean)$data;

        break;

                case 's':   // 字符串

                default:

                    $data   =   (string)$data;

        }

        }

    }else{ // 变量默认值

        $data       =    isset($default)?$default:null;

    }

    is_array($data) && array_walk_recursive($data,'think_filter');

    return $data;

}

I方法主要是用来获取前台传给后台的值,方法定义了四个参数,只有一个是必须的,此参数为所要获取的名称,其他都是可以变的。

以上标红的便是自己看代码过程中的记得一些知识点。

功能:安全的获取input传过来的参数

实现思路:

如果提交的时候跟上了类型,则按指定的类型处理,如果没有跟上指定类型,则根据服务器变量来确定类型。

通过过滤来确保提交的数据的安全性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  thinkphp php 源码