/**
* 递归过滤给定的值
* @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;
}// 魔法获取
}
[李景山php]每天TP5-20170203|thinkphp5-Request.php-6
最新推荐文章于 2024-11-14 15:22:28 发布