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;
}
原文:http://www.cnblogs.com/wuhen781/p/4355857.html