/**
* 获取输入参数 支持过滤和默认值
* 使用方法:
* <code>
* I('id',0); 获取id参数 自动判断get或者post
* I('post.name','','htmlspecialchars'); 获取$_POST['name']
* I('get.'); 获取$_GET
* </code>
* @param string $name 变量的名称 支持指定类型
* @param mixed $default 不存在的时候默认值
* @param mixed $filter 参数过滤方法
* @param mixed $datas 要获取的额外数据源
* @return mixed
*/
function I($name,$default='',$filter=null,$datas=null) {// $name 为 I('这里的参数')
static $_PUT = null; //定义一个静态属性
if(strpos($name,'/')){ // 指定修饰符
list($name,$type) = explode('/',$name,2); // 取name的第一个'/'分割的前后两对分配给$name,$type两个变量
}elseif(C('VAR_AUTO_STRING')){ // 默认强制转换为字符串
$type = 's';//没有收到相应的$name的话 那么参数就为s
}
if(strpos($name,'.')) { // 指定参数来源
list($method,$name) = explode('.',$name,2); //跟上面一样 这里就是判断接收的方式 如post.xx get.xx
}else{ // 默认为自动判断
$method = 'param';// 如果没有上面的格式的话 那么自动判断
}
switch(strtolower($method)) { //先讲以上的方法都转换为小写的字符 然后进行switch分支进行判断
case 'get' :
$input =& $_GET; //引用$_GET
break;
case 'post' :
$input =& $_POST;//引用$_POST
break;
case 'put' :
if(is_null($_PUT)){ //判断之前定义的静态属性是否为空
parse_str(file_get_contents('php://input'), $_PUT); //利用php协议来接收put方法的值
}
$input = $_PUT;
break;
case 'param' ://这里的话就是进行自动判断
switch($_SERVER['REQUEST_METHOD']) {
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' : //获取 PATHINFO模式的URL参数
$input = array();
if(!empty($_SERVER['PATH_INFO'])){
$depr = C('URL_PATHINFO_DEPR');
$input = explode($depr,trim($_SERVER['PATH_INFO'],$depr));
}
break;
case 'request' : //request请求的判断
$input =& $_REQUEST;
break;
case 'session' : //获取 $_SESSION 参数
$input =& $_SESSION;
break;
case 'cookie' : //获取 $_COOKIE 参数
$input =& $_COOKIE;
break;
case 'server' : //获取 $_SERVER 参数
$input =& $_SERVER;
break;
case 'globals' : //获取 $GLOBALS参数
$input =& $GLOBALS;
break;
case 'data' : //获取 其他类型的参数,需要配合额外数据源参数
$input =& $datas;
break;
default:
return null;
}
if(''==$name) { // 获取全部变量
$data = $input; //$data接收 请求参数所接收的值
$filters = isset($filter)?$filter:C('DEFAULT_FILTER');//参数过滤方法 默认参数为DEFAULT_FILTER 就是进行html转义
if($filters) {
if(is_string($filters)){
$filters = explode(',',$filters); //如果是默认参数是多个函数进行过滤的话 那么这里就分成数组再用下面的foreach进行遍历 然后反复用自定义的函数进行过滤
}
foreach($filters as $filter){//遍历过滤
$data = array_map_recursive($filter,$data); // 自定义的函数 去进行参数过滤
}
}
}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)){ //如果有 那么自定义的正则验证
// 支持正则验证
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(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'); //对数组中的每个元素应用think_filter函数
return $data; //返回接收的参数
}
function array_map_recursive($filter, $data) {
$result = array();
foreach ($data as $key => $val) {
$result[$key] = is_array($val)
? array_map_recursive($filter, $val)
: call_user_func($filter, $val);
}
return $result;
}
Thinkphp3.2.3的I方法的了解
最新推荐文章于 2021-11-02 16:25:02 发布