thinkphp I方法取传参

  1 /**
  2  * 获取输入参数 支持过滤和默认值
  3  * 使用方法:
  4  * <code>
  5  * I('id',0); 获取id参数 自动判断get或者post
  6  * I('post.name','','htmlspecialchars'); 获取$_POST['name']
  7  * I('get.'); 获取$_GET
  8  * </code>
  9  * @param string $name 变量的名称 支持指定类型
 10  * @param mixed $default 不存在的时候默认值
 11  * @param mixed $filter 参数过滤方法
 12  * @param mixed $datas 要获取的额外数据源
 13  * @return mixed
 14  */
 15 function I($name,$default='',$filter=null,$datas=null) {
 16     if(strpos($name,'/')){ // 指定修饰符
 17         list($name,$type)     =    explode('/',$name,2);
 18     }elseif(C('VAR_AUTO_STRING')){ // 默认强制转换为字符串
 19         $type   =   's';
 20     }
 21     if(strpos($name,'.')) { // 指定参数来源
 22         list($method,$name) =   explode('.',$name,2);
 23     }else{ // 默认为自动判断
 24         $method =   'param';
 25     }
 26     switch(strtolower($method)) {
 27         case 'get'     :   $input =& $_GET;break;
 28         case 'post'    :   $input =& $_POST;break;
 29         case 'put'     :   parse_str(file_get_contents('php://input'), $input);break;
 30         case 'param'   :
 31             switch($_SERVER['REQUEST_METHOD']) {
 32                 case 'POST':
 33                     $input  =  $_POST;
 34                     break;
 35                 case 'PUT':
 36                     parse_str(file_get_contents('php://input'), $input);
 37                     break;
 38                 default:
 39                     $input  =  $_GET;
 40             }
 41             break;
 42         case 'path'    :   
 43             $input  =   array();
 44             if(!empty($_SERVER['PATH_INFO'])){
 45                 $depr   =   C('URL_PATHINFO_DEPR');
 46                 $input  =   explode($depr,trim($_SERVER['PATH_INFO'],$depr));            
 47             }
 48             break;
 49         case 'request' :   $input =& $_REQUEST;   break;
 50         case 'session' :   $input =& $_SESSION;   break;
 51         case 'cookie'  :   $input =& $_COOKIE;    break;
 52         case 'server'  :   $input =& $_SERVER;    break;
 53         case 'globals' :   $input =& $GLOBALS;    break;
 54         case 'data'    :   $input =& $datas;      break;
 55         default:
 56             return NULL;
 57     }
 58     if(''==$name) { // 获取全部变量
 59         $data       =   $input;
 60         $filters    =   isset($filter)?$filter:C('DEFAULT_FILTER');
 61         if($filters) {
 62             if(is_string($filters)){
 63                 $filters    =   explode(',',$filters);
 64             }
 65             foreach($filters as $filter){
 66                 $data   =   array_map_recursive($filter,$data); // 参数过滤
 67             }
 68         }
 69     }elseif(isset($input[$name])) { // 取值操作
 70         $data       =   $input[$name];
 71         $filters    =   isset($filter)?$filter:C('DEFAULT_FILTER');
 72         if($filters) {
 73             if(is_string($filters)){
 74                 $filters    =   explode(',',$filters);
 75             }elseif(is_int($filters)){
 76                 $filters    =   array($filters);
 77             }
 78             
 79             foreach($filters as $filter){
 80                 if(function_exists($filter)) {
 81                     $data   =   is_array($data) ? array_map_recursive($filter,$data) : $filter($data); // 参数过滤
 82                 }elseif(0===strpos($filter,'/')){
 83                     // 支持正则验证
 84                     if(1 !== preg_match($filter,(string)$data)){
 85                         return   isset($default) ? $default : NULL;
 86                     }
 87                 }else{
 88                     $data   =   filter_var($data,is_int($filter) ? $filter : filter_id($filter));
 89                     if(false === $data) {
 90                         return   isset($default) ? $default : NULL;
 91                     }
 92                 }
 93             }
 94         }
 95         if(!empty($type)){
 96             switch(strtolower($type)){
 97                 case 'a':    // 数组
 98                     $data     =    (array)$data;
 99                     break;
100                 case 'd':    // 数字
101                     $data     =    (int)$data;
102                     break;
103                 case 'f':    // 浮点
104                     $data     =    (float)$data;
105                     break;
106                 case 'b':    // 布尔
107                     $data     =    (boolean)$data;
108                     break;
109                 case 's':   // 字符串
110                 default:
111                     $data   =   (string)$data;
112             }
113         }
114     }else{ // 变量默认值
115         $data       =    isset($default)?$default:NULL;
116     }
117     is_array($data) && array_walk_recursive($data,'think_filter');
118     return $data;
119 }

 

posted @ 2015-02-27 17:13  李照耀  阅读(3109)  评论(0编辑  收藏  举报