[李景山php]每天TP5-20170203|thinkphp5-Request.php-6

来源:互联网 发布:邓婕版王熙凤点评 知乎 编辑:程序博客网 时间:2024/06/05 00:57
    /**     * 递归过滤给定的值     * @param mixed     $value 键值     * @param mixed     $key 键名     * @param array     $filters 过滤方法+默认值     * @return mixed     */    private function filterValue(&$value, $key, $filters)    {// 递归过滤给定的值 filterValue 传引用 $key 貌似没有用 过滤器        $default = array_pop($filters);// 首先 拉取 默认的 过滤器        foreach ($filters as $filter) {// 遍历循环 过滤器            if (is_callable($filter)) {// 如果是可以调用的                // 调用函数或者方法过滤                $value = call_user_func($filter, $value);// 执行函数调用            } elseif (is_scalar($value)) {// 是否是标量 标准 的变量                if (strpos($filter, '/')) {// 如果 过滤器 含有 / 的方式 当作正则表达式                    // 正则过滤                    if (!preg_match($filter, $value)) {// 正则过滤                        // 匹配不成功返回默认值                        $value = $default;                        break;                    }                } elseif (!empty($filter)) {                    // filter函数不存在时, 则使用filter_var进行过滤                    // filter为非整形值时, 调用filter_id取得过滤id                    $value = filter_var($value, is_int($filter) ? $filter : filter_id($filter));// 利用过滤器的形式过滤                    // 厉害了我的哥,牛叉                    if (false === $value) {// 如果 为空                        $value = $default;// 默认值                        break;                    }                }            }        }        return $this->filterExp($value);// 执行全部检查 返回后的结果        // 然后执行 表达式 过滤    }    /**     * 过滤表单中的表达式     * @param string $value     * @return void     */    public function filterExp(&$value)    {        // 过滤查询特殊字符        if (is_string($value) && preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i', $value)) {            $value .= ' ';        }        // TODO 其他安全过滤    }// 过滤表单中的表达式    /**     * 强制类型转换     * @param string $data     * @param string $type     * @return mixed     */    private function typeCast(&$data, $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:                if (is_scalar($data)) {// 标量                    $data = (string) $data;// 数据强制类型转换 这个挺好的                } else {                    throw new \InvalidArgumentException('variable type error:' . gettype($data));                }        }    }    /**     * 是否存在某个请求参数     * @access public     * @param string    $name 变量名     * @param string    $type 变量类型     * @param bool      $checkEmpty 是否检测空值     * @return mixed     */    public function has($name, $type = 'param', $checkEmpty = false)    {// 是否存在请求的参数        if (empty($this->$type)) {// 如果为空            $param = $this->$type(); // 获取参数的        } else {            $param = $this->$type;// 参数 获取        }        // 按.拆分成多维数组进行判断        foreach (explode('.', $name) as $val) {// 拆分多维数组            if (isset($param[$val])) {// 如果当前参数设置                $param = $param[$val];// 参数固定            } else {                return false;            }        }        return ($checkEmpty && '' === $param) ? false : true;// 返回数据    }    /**     * 获取指定的参数     * @access public     * @param string|array  $name 变量名     * @param string        $type 变量类型     * @return mixed     */    public function only($name, $type = 'param')// 获取指定的参数    {        $param = $this->$type();// 如果参数 为类型的 很多东西        if (is_string($name)) {// 如果是 字符串            $name = explode(',', $name);// 打散        }        $item = [];// 队列        foreach ($name as $key) {// 遍历循环            if (isset($param[$key])) {// 如果设置了 参数                $item[$key] = $param[$key];// 参数 获取            }        }        return $item;// 返回数据    }    /**     * 排除指定参数获取     * @access public     * @param string|array  $name 变量名     * @param string        $type 变量类型     * @return mixed     */    public function except($name, $type = 'param')    {// 排除 指定参数        $param = $this->$type();// param 参数        if (is_string($name)) {// 如果是字符串            $name = explode(',', $name);// 转数组        }        foreach ($name as $key) {// 变量数组            if (isset($param[$key])) {                unset($param[$key]);            }        }        return $param;// 返回剔除之后的数据    }    /**     * 当前是否ssl     * @access public     * @return bool     */    public function isSsl()    {// 是否 ssl 模式        $server = array_merge($_SERVER, $this->server);// 拼合全部相关数据        if (isset($server['HTTPS']) && ('1' == $server['HTTPS'] || 'on' == strtolower($server['HTTPS']))) {            return true;// 如果 服务器        } elseif (isset($server['REQUEST_SCHEME']) && 'https' == $server['REQUEST_SCHEME']) {            return true;// 如果 请求        } elseif (isset($server['SERVER_PORT']) && ('443' == $server['SERVER_PORT'])) {            return true;// 如果 port 端口        } elseif (isset($server['HTTP_X_FORWARDED_PROTO']) && 'https' == $server['HTTP_X_FORWARDED_PROTO']) {            return true;// 如果 https        }        return false;    }    /**     * 当前是否Ajax请求     * @access public     * @return bool     */    public function isAjax()    {// 当前 是否 ajax 请求        $value = $this->server('HTTP_X_REQUESTED_WITH');        return (!is_null($value) && strtolower($value) == 'xmlhttprequest') ? true : false;    }    /**     * 当前是否Pjax请求     * @access public     * @return bool     */    public function isPjax()    {        return !is_null($this->server('HTTP_X_PJAX')) ? true : false;    }// 神奇的 Pjax 方式    /**     * 获取客户端IP地址     * @param integer   $type 返回类型 0 返回IP地址 1 返回IPV4地址数字     * @param boolean   $adv 是否进行高级模式获取(有可能被伪装)     * @return mixed     */    public function ip($type = 0, $adv = false)    {        $type      = $type ? 1 : 0;        static $ip = null;        if (null !== $ip) {            return $ip[$type];        }        if ($adv) {            if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {                $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);                $pos = array_search('unknown', $arr);                if (false !== $pos) {                    unset($arr[$pos]);                }                $ip = trim($arr[0]);            } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {                $ip = $_SERVER['HTTP_CLIENT_IP'];            } elseif (isset($_SERVER['REMOTE_ADDR'])) {                $ip = $_SERVER['REMOTE_ADDR'];            }        } elseif (isset($_SERVER['REMOTE_ADDR'])) {            $ip = $_SERVER['REMOTE_ADDR'];        }        // IP地址合法验证        $long = sprintf("%u", ip2long($ip));        $ip   = $long ? array($ip, $long) : array('0.0.0.0', 0);        return $ip[$type];    }    /**     * 检测是否使用手机访问     * @access public     * @return bool     */    public function isMobile()    {        if (isset($_SERVER['HTTP_VIA']) && stristr($_SERVER['HTTP_VIA'], "wap")) {            return true;        } elseif (isset($_SERVER['HTTP_ACCEPT']) && strpos(strtoupper($_SERVER['HTTP_ACCEPT']), "VND.WAP.WML")) {            return true;        } elseif (isset($_SERVER['HTTP_X_WAP_PROFILE']) || isset($_SERVER['HTTP_PROFILE'])) {            return true;        } elseif (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/(blackberry|configuration\/cldc|hp |hp-|htc |htc_|htc-|iemobile|kindle|midp|mmp|motorola|mobile|nokia|opera mini|opera |Googlebot-Mobile|YahooSeeker\/M1A1-R2D2|android|iphone|ipod|mobi|palm|palmos|pocket|portalmmm|ppc;|smartphone|sonyericsson|sqh|spv|symbian|treo|up.browser|up.link|vodafone|windows ce|xda |xda_)/i', $_SERVER['HTTP_USER_AGENT'])) {            return true;        } else {            return false;        }    }// 如果是 手机端    // 根据访问来路进行确认    /**     * 当前URL地址中的scheme参数     * @access public     * @return string     */    public function scheme()    {        return $this->isSsl() ? 'https' : 'http';    }// 如果 https 或者 http    /**     * 当前请求URL地址中的query参数     * @access public     * @return string     */    public function query()    {        return $this->server('QUERY_STRING');    }// 当前请求 URL 地址中的 query 参数    /**     * 当前请求的host     * @access public     * @return string     */    public function host()    {        return $this->server('HTTP_HOST');    }// 当前请求的 host    /**     * 当前请求URL地址中的port参数     * @access public     * @return integer     */    public function port()    {        return $this->server('SERVER_PORT');    }// 端口    /**     * 当前请求 SERVER_PROTOCOL     * @access public     * @return integer     */    public function protocol()    {        return $this->server('SERVER_PROTOCOL');    }// server_protocol    /**     * 当前请求 REMOTE_PORT     * @access public     * @return integer     */    public function remotePort()    {        return $this->server('REMOTE_PORT');    }// remote_port    /**     * 获取当前请求的路由信息     * @access public     * @param array $route 路由名称     * @return array     */    public function routeInfo($route = [])    {        if (!empty($route)) {// 如果为空            $this->routeInfo = $route;        } else {            return $this->routeInfo;        }    }// 获取路由信息  好神奇的方式    /**     * 设置或者获取当前请求的调度信息     * @access public     * @param array  $dispatch 调度信息     * @return array     */    public function dispatch($dispatch = null)    {        if (!is_null($dispatch)) {            $this->dispatch = $dispatch;        }        return $this->dispatch;    }// 调度信息 踢出    /**     * 设置或者获取当前的模块名     * @access public     * @param string $module 模块名     * @return string|$this     */    public function module($module = null)    {        if (!is_null($module)) {            $this->module = $module;            return $this;        } else {            return $this->module ?: '';        }    }// 一样的模块名称    /**     * 设置或者获取当前的控制器名     * @access public     * @param string $controller 控制器名     * @return string|$this     */    public function controller($controller = null)    {        if (!is_null($controller)) {            $this->controller = $controller;            return $this;        } else {            return $this->controller ?: '';        }    }// 控制器 名    /**     * 设置或者获取当前的操作名     * @access public     * @param string $action 操作名     * @return string     */    public function action($action = null)    {        if (!is_null($action)) {            $this->action = $action;            return $this;        } else {            return $this->action ?: '';        }    }// 操作名    /**     * 设置或者获取当前的语言     * @access public     * @param string $lang 语言名     * @return string     */    public function langset($lang = null)    {        if (!is_null($lang)) {            $this->langset = $lang;            return $this;        } else {            return $this->langset ?: '';        }    }// 语言设置    /**     * 设置或者获取当前请求的content     * @access public     * @return string     */    public function getContent()    {        if (is_null($this->content)) {            $this->content = file_get_contents('php://input');        }        return $this->content;    }// 获取请求内容    /**     * 生成请求令牌     * @access public     * @param string $name 令牌名称     * @param mixed  $type 令牌生成方法     * @return string     */    public function token($name = '__token__', $type = 'md5')    {        $type  = is_callable($type) ? $type : 'md5';        $token = call_user_func($type, $_SERVER['REQUEST_TIME_FLOAT']);        if ($this->isAjax()) {            header($name . ': ' . $token);        }        Session::set($name, $token);        return $token;    }// 生成控制令牌    /**     * 设置当前请求绑定的对象实例     * @access public     * @param string $name 绑定的对象标识     * @param mixed  $obj 绑定的对象实例     * @return mixed     */    public function bind($name, $obj = null)    {        if (is_array($name)) {            $this->bind = array_merge($this->bind, $name);        } else {            $this->bind[$name] = $obj;        }    }//参数绑定    public function __set($name, $value)    {        $this->bind[$name] = $value;    }// 魔法设置    public function __get($name)    {        return isset($this->bind[$name]) ? $this->bind[$name] : null;    }// 魔法获取}
0 0
原创粉丝点击