ThinkPHP函数I代码优化

ThinkPHP/Common/common.php 文件

I函数,主要用来获取一些gpc请求的变量的,函数有一部分代码是过滤变量的,每次都运行一次,其实是没有必要的。

如果你每次都像这样的方式调用的话:$a = I('post.a');$c = I('post.b');$c = I('post.c');过滤函数就会对$_POST数据进行3次重复的过滤,考虑到这个函数属于频繁调用的,可以优化一下。

优化方案,增加一个静态变量,将第一次运行后的数据存储起来,后续调用直接取出来就可以了,代码如下:

//by zxm 行是我修改的代码部分

function I($name,$default='',$filter=null) {
    static $maps = array();//by zxm
    if(strpos($name,'.')) { // 指定参数来源
        list($method,$name) =   explode('.',$name,2);
    }else{ // 默认为自动判断
        $method =   'param';
    }
    if(!isset($maps[$method])){//by zxm
        switch(strtolower($method)) {
        case 'get'     :   $input =& $_GET;break;
        case 'post'    :   $input =& $_POST;break;
        case 'put'     :   parse_str(file_get_contents('php://input'), $input);break;
        case 'param'   :  
            switch($_SERVER['REQUEST_METHOD']) {
            case 'POST':
                $input  =  $_POST;
                break;
            case 'PUT':
                parse_str(file_get_contents('php://input'), $input);
                break;
            default:
                $input  =  $_GET;
            }
            if(C('VAR_URL_PARAMS') && isset($_GET[C('VAR_URL_PARAMS')])){
                $input  =   array_merge($input,$_GET[C('VAR_URL_PARAMS')]);
            }
            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;
            default:
                return NULL;
        }
        // 全局过滤
        // array_walk_recursive($input,'filter_exp');

        if(C('VAR_FILTERS')) {
            $_filters    =   explode(',',C('VAR_FILTERS'));
            foreach($_filters as $_filter){
                // 全局参数过滤
                array_walk_recursive($input,$_filter);
            }
        }
        $maps[$method] = $input;//by zxm
    }else{
        $input = $maps[$method];//by zxm
    }



    if(empty($name)) { // 获取全部变量
        $data       =   $input; 
        $filters    =   isset($filter)?$filter:C('DEFAULT_FILTER');
        if($filters) {
            $filters    =   explode(',',$filters);
            foreach($filters as $filter){
                $data   =   array_map($filter,$data); // 参数过滤
            }
        }        
    }elseif(isset($input[$name])) { // 取值操作
        $data       =	$input[$name];
        $filters    =   isset($filter)?$filter:C('DEFAULT_FILTER');
        if($filters) {
            $filters    =   explode(',',$filters);
            foreach($filters as $filter){
                if(function_exists($filter)) {
                    $data   =   is_array($data)?array_map($filter,$data):$filter($data); // 参数过滤
                }else{
                    $data   =   filter_var($data,is_int($filter)?$filter:filter_id($filter));
                    if(false === $data) {
                        return	 isset($default)?$default:NULL;
                    }
                }
            }
        }
    }else{ // 变量默认值
        $data       =	 isset($default)?$default:NULL;
    }
    return $data;
}

  

原文地址:https://www.cnblogs.com/wuhen781/p/4355857.html