コード例 #1
0
ファイル: functions.php プロジェクト: beyondzgz/thinkphp
/**
 * 获取输入参数 支持过滤和默认值
 * 使用方法:
 * <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)
{
    if (strpos($name, '/')) {
        // 指定修饰符
        list($name, $type) = explode('/', $name, 2);
    }
    if (strpos($name, '.')) {
        // 指定参数来源
        list($method, $name) = explode('.', $name, 2);
    } else {
        // 默认为自动判断
        $method = 'param';
    }
    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;
            }
            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');
        if ($filters) {
            if (is_string($filters)) {
                $filters = explode(',', $filters);
            }
            foreach ($filters as $filter) {
                $data = arrayMapRecursive($filter, $data);
                // 参数过滤
            }
        }
    } elseif (isset($input[$name])) {
        // 取值操作
        $data = $input[$name];
        $filters = isset($filter) ? $filter : C('DEFAULT_FILTER');
        if ($filters) {
            if (is_string($filters)) {
                $filters = explode(',', $filters);
            } elseif (is_int($filters)) {
                $filters = array($filters);
            }
            foreach ($filters as $filter) {
                if (function_exists($filter)) {
                    $data = is_array($data) ? arrayMapRecursive($filter, $data) : $filter($data);
                    // 参数过滤
                } elseif (0 === strpos($filter, '/')) {
                    // 支持正则验证
                    if (1 !== preg_match($filter, (string) $data)) {
                        return isset($default) ? $default : null;
                    }
                } 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 's':
                    // 字符串
                    $data = (string) $data;
                    break;
                case 'a':
                    // 数组
                    $data = (array) $data;
                    break;
                case 'd':
                    // 数字
                    $data = (int) $data;
                    break;
                case 'f':
                    // 浮点
                    $data = (double) $data;
                    break;
                case 'b':
                    // 布尔
                    $data = (bool) $data;
                    break;
            }
        }
    } else {
        // 变量默认值
        $data = isset($default) ? $default : null;
    }
    is_array($data) && array_walk_recursive($data, 'think_filter');
    return $data;
}
コード例 #2
0
ファイル: functions.php プロジェクト: 962464/thinkphp
function arrayMapRecursive($filter, $data)
{
    $result = array();
    foreach ($data as $key => $val) {
        $result[$key] = is_array($val) ? arrayMapRecursive($filter, $val) : call_user_func($filter, $val);
    }
    return $result;
}