//------------------------// ThinkPHP 助手函数//-------------------------use think\Cache;// 加载 Cache 类型use think\Config;// 加载配置文件类use think\Cookie;// 加载 Cookieuse think\Db;// 加载 Dbuse think\Debug;// 加载 Debuguse think\exception\HttpException;// 加载 异常use think\exception\HttpResponseException;// 加载 异常use think\Lang;// 加载 语言use think\Loader;// 加载 加载文件use think\Log;// 加载 日志use think\Request;// 请求use think\Response;// 回应use think\Session;//Sessionuse think\Url;// Urluse think\View;// View// 作为一个helper 使用了很多的 东西// a new namespace 用法if (!function_exists('load_trait')) {    /**     * 快速导入Traits PHP5.5以上无需调用     * @param string    $class trait库     * @param string    $ext 类库后缀     * @return boolean     */    function load_trait($class, $ext = EXT)    {        return Loader::import($class, TRAIT_PATH, $ext);// a trap function about this loader class and this import function    }// 加载文件,按照 不同的 标准类型}if (!function_exists('exception')) {    /**     * 抛出异常处理     *     * @param string    $msg  异常消息     * @param integer   $code 异常代码 默认为0     * @param string    $exception 异常类     *     * @throws Exception     */    function exception($msg, $code = 0, $exception = '')    {        $e = $exception ?: '\think\Exception';// 使用异常处理类        throw new $e($msg, $code);//抛出 新异常    }// 异常 出来}if (!function_exists('debug')) {    /**     * 记录时间(微秒)和内存使用情况     * @param string            $start 开始标签     * @param string            $end 结束标签     * @param integer|string    $dec 小数位 如果是m 表示统计内存占用     * @return mixed     */    function debug($start, $end = '', $dec = 6)    {        if ('' == $end) {            Debug::remark($start);// Debug::        } else {            return 'm' == $dec ? Debug::getRangeMem($start, $end) : Debug::getRangeTime($start, $end, $dec);        }// 如果是 m 的话,则记录的是 getRangeMem    }}if (!function_exists('lang')) {    /**     * 获取语言变量值     * @param string    $name 语言变量名     * @param array     $vars 动态变量值     * @param string    $lang 语言     * @return mixed     */    function lang($name, $vars = [], $lang = '')    {        return Lang::get($name, $vars, $lang);// 获取语言配置, 对类的二次封装        // 这个版本 对比 3的版本 发现了 更多功能隐藏在了 class 里面,更多的面向对象了    }}if (!function_exists('config')) {    /**     * 获取和设置配置参数     * @param string|array  $name 参数名     * @param mixed         $value 参数值     * @param string        $range 作用域     * @return mixed     */    function config($name = '', $value = null, $range = '')    {        if (is_null($value) && is_string($name)) {            return 0 === strpos($name, '?') ? Config::has(substr($name, 1), $range) : Config::get($name, $range);            // 中国 第一 超强 配置,太牛叉了,不错 通过不同的配置项,让 自己的函数 具有更强的功能        } else {            return Config::set($name, $value, $range);// other 否则 去设置 对应的 文件        }    }}if (!function_exists('input')) {    /**     * 获取输入数据 支持默认值和过滤     * @param string    $key 获取的变量名     * @param mixed     $default 默认值     * @param string    $filter 过滤方法     * @return mixed     */    function input($key = '', $default = null, $filter = null)    {        if (0 === strpos($key, '?')) {            $key = substr($key, 1);            $has = true;        }// 判读 时候 包含 这个 输入 input 好巴适,去掉了 更多 浮躁,更多的融入了这个代码        if ($pos = strpos($key, '.')) {// 如果有这些 比如 input('get.ok')            // 指定参数来源            $method = substr($key, 0, $pos);            if (in_array($method, ['get', 'post', 'put', 'patch', 'delete', 'param', 'request', 'session', 'cookie', 'server', 'env', 'path', 'file'])) {                $key = substr($key, $pos + 1);            } else {                $method = 'param';            }            // 当非明确来源的时候,显示通用的来源        } else {            // 默认为自动判断            $method = 'param';// 默认也是这个        }        if (isset($has)) {            return request()->has($key, $method, $default);// 如果是 ?get.ok 去判读是否有这个        } else {            return request()->$method($key, $default, $filter);// 否则返回数据            // 比如 request()->get('ok','123','htmlspechialchar');        }    }}