ホームページ  >  記事  >  バックエンド開発  >  ThinkPHP レター関数

ThinkPHP レター関数

不言
不言オリジナル
2018-04-21 14:03:031635ブラウズ

这篇文章介绍的内容是关于ThinkPHP字母函数,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

<?php/////////////////////////////////////////////////////////A///////////////////////////////////////////////////////////////**
 * 实例化多层控制器 格式:[资源://][模块/]控制器
 * @param string $name 资源地址
 * @param string $layer 控制层名称
 * @param integer $level 控制器层次
 * @return Think\Controller|false
 */function A($name,$layer=&#39;&#39;,$level=0) {
    static $_action = array();    
    $layer  =   $layer? : C(&#39;DEFAULT_C_LAYER&#39;);    
    $level  =   $level? : ($layer == C(&#39;DEFAULT_C_LAYER&#39;)?C(&#39;CONTROLLER_LEVEL&#39;):1);   
     if(isset($_action[$name.$layer]))        
     return $_action[$name.$layer];    
     $class  =   parse_res_name($name,$layer,$level);    
     if(class_exists($class)) {       
      $action             =   new $class();        
      $_action[$name.$layer]     =   $action;        
      return $action;
    }else {        return false;
    }
}////////////////////////////////////////////////////////B////////////////////////////////////////////////////////////////**
 * 执行某个行为
 * @param string $name 行为名称
 * @param string $tag 标签名称(行为类无需传入) 
 * @param Mixed $params 传入的参数
 * @return void
 */function B($name, $tag=&#39;&#39;,&$params=NULL) {
    if(&#39;&#39;==$tag){        $name   .=  &#39;Behavior&#39;;
    }    return \Think\Hook::exec($name,$tag,$params);
}////////////////////////////////////////////////////////C////////////////////////////////////////////////////////////////**
 * 获取和设置配置参数 支持批量定义
 * @param string|array $name 配置变量
 * @param mixed $value 配置值
 * @param mixed $default 默认值
 * @return mixed
 */function C($name=null, $value=null,$default=null) {
    static $_config = array();    // 无参数时获取所有
    if (empty($name)) {        return $_config;
    }    // 优先执行设置获取或赋值
    if (is_string($name)) {        if (!strpos($name, &#39;.&#39;)) {            
    $name = strtoupper($name);            
    if (is_null($value))                
    return isset($_config[$name]) ? $_config[$name] : $default;            
    $_config[$name] = $value;            
    return null;
        }        // 二维数组设置和获取支持
        $name = explode(&#39;.&#39;, $name);        
        $name[0]   =  strtoupper($name[0]);        
        if (is_null($value))            
        return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : $default;        
        $_config[$name[0]][$name[1]] = $value;        
        return null;
    }    // 批量设置
    if (is_array($name)){        $_config = array_merge($_config, array_change_key_case($name,CASE_UPPER));        return null;
    }    return null; // 避免非法参数}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
 * 实例化模型类 格式 [资源://][模块/]模型
 * @param string $name 资源地址
 * @param string $layer 模型层名称
 * @return Think\Model
 */function D($name=&#39;&#39;,$layer=&#39;&#39;) {
    if(empty($name)) return new Think\Model;    
    static $_model  =   array();    $layer          =   $layer? : C(&#39;DEFAULT_M_LAYER&#39;);    
    if(isset($_model[$name.$layer]))        return $_model[$name.$layer];    
    $class          =   parse_res_name($name,$layer);    
    if(class_exists($class)) 
    {        
    $model      =   new $class(basename($name));
    }elseif(false === strpos($name,&#39;/&#39;)){        // 自动加载公共模块下面的模型
        if(!C(&#39;APP_USE_NAMESPACE&#39;)){
            import(&#39;Common/&#39;.$layer.&#39;/&#39;.$class);
        }else{            $class      =   &#39;\\Common\\&#39;.$layer.&#39;\\&#39;.$name.$layer;
        }        $model      =   class_exists($class)? new $class($name) : new Think\Model($name);
    }else {
        Think\Log::record(&#39;D方法实例化没找到模型类&#39;.$class,Think\Log::NOTICE);        $model      =   new Think\Model(basename($name));
    }    $_model[$name.$layer]  =  $model;    return $model;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
 * 抛出异常处理
 * @param string $msg 异常消息
 * @param integer $code 异常代码 默认为0
 * @throws Think\Exception
 * @return void
 */function E($msg, $code=0) {
    throw new Think\Exception($msg, $code);
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
 * 快速文件数据读取和保存 针对简单类型数据 字符串、数组
 * @param string $name 缓存名称
 * @param mixed $value 缓存值
 * @param string $path 缓存路径
 * @return mixed
 */function F($name, $value=&#39;&#39;, $path=DATA_PATH) {
    static $_cache  =   array();    $filename       =   $path . $name . &#39;.php&#39;;    if (&#39;&#39; !== $value) {        if (is_null($value)) {            // 删除缓存
            if(false !== strpos($name,&#39;*&#39;)){                return false; // TODO 
            }else{                unset($_cache[$name]);                return Think\Storage::unlink($filename,&#39;F&#39;);
            }
        } else {
            Think\Storage::put($filename,serialize($value),&#39;F&#39;);            // 缓存数据
            $_cache[$name]  =   $value;            return null;
        }
    }    // 获取缓存数据
    if (isset($_cache[$name]))        
    return $_cache[$name];    
    if (Think\Storage::has($filename,&#39;F&#39;)){        
    $value      =   unserialize(Think\Storage::read($filename,&#39;F&#39;));        
    $_cache[$name]  =   $value;
    } else {        $value          =   false;
    }    return $value;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
 * 记录和统计时间(微秒)和内存使用情况
 * 使用方法:
 * <code>
 * G(&#39;begin&#39;); // 记录开始标记位
 * // ... 区间运行代码
 * G(&#39;end&#39;); // 记录结束标签位
 * echo G(&#39;begin&#39;,&#39;end&#39;,6); // 统计区间运行时间 精确到小数后6位
 * echo G(&#39;begin&#39;,&#39;end&#39;,&#39;m&#39;); // 统计区间内存使用情况
 * 如果end标记位没有定义,则会自动以当前作为标记位
 * 其中统计内存使用需要 MEMORY_LIMIT_ON 常量为true才有效
 * </code>
 * @param string $start 开始标签
 * @param string $end 结束标签
 * @param integer|string $dec 小数位或者m
 * @return mixed
 */function G($start,$end=&#39;&#39;,$dec=4) {
    static $_info       =   array();    static $_mem        =   array();    if(is_float($end)) { // 记录时间
        $_info[$start]  =   $end;
    }elseif(!empty($end)){ // 统计时间和内存使用
        if(!isset($_info[$end])) $_info[$end]       =  microtime(TRUE);        
        if(MEMORY_LIMIT_ON && $dec==&#39;m&#39;){           
         if(!isset($_mem[$end])) $_mem[$end]     =  memory_get_usage();            
         return number_format(($_mem[$end]-$_mem[$start])/1024);
        }else{            return number_format(($_info[$end]-$_info[$start]),$dec);
        }


    }else{ // 记录时间和内存使用
        $_info[$start]  =  microtime(TRUE);        if(MEMORY_LIMIT_ON) $_mem[$start]           =  memory_get_usage();
    }    return null;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
 * 获取输入参数 支持过滤和默认值
 * 使用方法:
 * <code>
 * I(&#39;id&#39;,0); 获取id参数 自动判断get或者post
 * I(&#39;post.name&#39;,&#39;&#39;,&#39;htmlspecialchars&#39;); 获取$_POST[&#39;name&#39;]
 * I(&#39;get.&#39;); 获取$_GET
 * </code>
 * @param string $name 变量的名称 支持指定类型
 * @param mixed $default 不存在的时候默认值
 * @param mixed $filter 参数过滤方法
 * @param mixed $datas 要获取的额外数据源
 * @return mixed
 */function I($name,$default=&#39;&#39;,$filter=null,$datas=null) {
    static $_PUT    =   null;    if(strpos($name,&#39;/&#39;)){ // 指定修饰符
        list($name,$type)   =   explode(&#39;/&#39;,$name,2);
    }elseif(C(&#39;VAR_AUTO_STRING&#39;)){ // 默认强制转换为字符串
        $type   =   &#39;s&#39;;
    }    if(strpos($name,&#39;.&#39;)) { // 指定参数来源
        list($method,$name) =   explode(&#39;.&#39;,$name,2);
    }else{ // 默认为自动判断
        $method =   &#39;param&#39;;
    }    switch(strtolower($method)) {        case &#39;get&#39;     :   
            $input =& $_GET;            break;        case &#39;post&#39;    :   
            $input =& $_POST;            break;        case &#39;put&#39;     :   
            if(is_null($_PUT)){
                parse_str(file_get_contents(&#39;php://input&#39;), $_PUT);
            }            $input  =   $_PUT;        
            break;        case &#39;param&#39;   :            switch($_SERVER[&#39;REQUEST_METHOD&#39;]) {                case &#39;POST&#39;:                    $input  =  $_POST;                    break;                case &#39;PUT&#39;:                    if(is_null($_PUT)){
                        parse_str(file_get_contents(&#39;php://input&#39;), $_PUT);
                    }                    $input  =   $_PUT;                    break;                default:                    $input  =  $_GET;
            }            break;        case &#39;path&#39;    :   
            $input  =   array();            if(!empty($_SERVER[&#39;PATH_INFO&#39;])){                
            $depr   =   C(&#39;URL_PATHINFO_DEPR&#39;);                $input  =   explode($depr,trim($_SERVER[&#39;PATH_INFO&#39;],$depr));            
            }            break;        case &#39;request&#39; :   
            $input =& $_REQUEST;   
            break;        case &#39;session&#39; :   
            $input =& $_SESSION;   
            break;        case &#39;cookie&#39;  :   
            $input =& $_COOKIE;    
            break;        case &#39;server&#39;  :   
            $input =& $_SERVER;    
            break;        case &#39;globals&#39; :   
            $input =& $GLOBALS;    
            break;        case &#39;data&#39;    :   
            $input =& $datas;      
            break;        default:            return null;
    }    if(&#39;&#39;==$name) { // 获取全部变量
        $data       =   $input;        $filters    =   isset($filter)?$filter:C(&#39;DEFAULT_FILTER&#39;);        if($filters) {            if(is_string($filters)){                $filters    =   explode(&#39;,&#39;,$filters);
            }            foreach($filters as $filter){                $data   =   array_map_recursive($filter,$data); // 参数过滤
            }
        }
    }elseif(isset($input[$name])) { // 取值操作
        $data       =   $input[$name];       
         $filters    =   isset($filter)?$filter:C(&#39;DEFAULT_FILTER&#39;);       
         if($filters) {            
        if(is_string($filters)){                if(0 === strpos($filters,&#39;/&#39;)){                    if(1 !== preg_match($filters,(string)$data)){                        // 支持正则验证
                        return   isset($default) ? $default : null;
                    }
                }else{                    $filters    =   explode(&#39;,&#39;,$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 &#39;a&#39;:   // 数组
                    $data   =   (array)$data;                    break;                case &#39;d&#39;:   // 数字
                    $data   =   (int)$data;                    break;                case &#39;f&#39;:   // 浮点
                    $data   =   (float)$data;                    break;                case &#39;b&#39;:   // 布尔
                    $data   =   (boolean)$data;                    break;                case &#39;s&#39;:   // 字符串
                default:                    $data   =   (string)$data;
            }
        }
    }else{ // 变量默认值
        $data       =    isset($default)?$default:null;
    }
    is_array($data) && array_walk_recursive($data,&#39;think_filter&#39;);    return $data;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
 * 获取和设置语言定义(不区分大小写)
 * @param string|array $name 语言变量
 * @param mixed $value 语言值或者变量
 * @return mixed
 */function L($name=null, $value=null) {
    static $_lang = array();    // 空参数返回所有定义
    if (empty($name))        return $_lang;    // 判断语言获取(或设置)
    // 若不存在,直接返回全大写$name
    if (is_string($name)) {        $name   =   strtoupper($name);        if (is_null($value)){            return isset($_lang[$name]) ? $_lang[$name] : $name;
        }elseif(is_array($value)){            // 支持变量
            $replace = array_keys($value);            foreach($replace as &$v){                $v = &#39;{$&#39;.$v.&#39;}&#39;;
            }            return str_replace($replace,$value,isset($_lang[$name]) ? $_lang[$name] : $name);        
        }        $_lang[$name] = $value; // 语言定义
        return null;
    }    // 批量定义
    if (is_array($name))        $_lang = array_merge($_lang, array_change_key_case($name, CASE_UPPER));    return null;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
 * 实例化一个没有模型文件的Model
 * @param string $name Model名称 支持指定基础模型 例如 MongoModel:User
 * @param string $tablePrefix 表前缀
 * @param mixed $connection 数据库连接信息
 * @return Think\Model
 */function M($name=&#39;&#39;, $tablePrefix=&#39;&#39;,$connection=&#39;&#39;) {
    static $_model  = array();    if(strpos($name,&#39;:&#39;)) {        list($class,$name)    =  explode(&#39;:&#39;,$name);
    }else{        $class      =   &#39;Think\\Model&#39;;
    }    $guid           =   (is_array($connection)?implode(&#39;&#39;,$connection):$connection).$tablePrefix . $name . &#39;_&#39; . $class;    
    if (!isset($_model[$guid]))        $_model[$guid] = new $class($name,$tablePrefix,$connection);    return $_model[$guid];
}/**
 * 设置和获取统计数据
 * 使用方法:
 * <code>
 * N(&#39;db&#39;,1); // 记录数据库操作次数
 * N(&#39;read&#39;,1); // 记录读取次数
 * echo N(&#39;db&#39;); // 获取当前页面数据库的所有操作次数
 * echo N(&#39;read&#39;); // 获取当前页面读取次数
 * </code>
 * @param string $key 标识位置
 * @param integer $step 步进值
 * @param boolean $save 是否保存结果
 * @return mixed
 */function N($key, $step=0,$save=false) {
    static $_num    = array();    if (!isset($_num[$key])) {        $_num[$key] = (false !== $save)? S(&#39;N_&#39;.$key) :  0;
    }    if (empty($step)){        return $_num[$key];
    }else{        $_num[$key] = $_num[$key] + (int)$step;
    }    if(false !== $save){ // 保存结果
        S(&#39;N_&#39;.$key,$_num[$key],$save);
    }    return null;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
 * 远程调用控制器的操作方法 URL 参数格式 [资源://][模块/]控制器/操作
 * @param string $url 调用地址
 * @param string|array $vars 调用参数 支持字符串和数组
 * @param string $layer 要调用的控制层名称
 * @return mixed
 */function R($url,$vars=array(),$layer=&#39;&#39;) {
    $info   =   pathinfo($url);    $action =   $info[&#39;basename&#39;];    $module =   $info[&#39;dirname&#39;];    $class  =   A($module,$layer);    if($class){        
    if(is_string($vars)) {
            parse_str($vars,$vars);
        }        return call_user_func_array(array(&$class,$action.C(&#39;ACTION_SUFFIX&#39;)),$vars);
    }else{        return false;
    }
}/**
 * 获取模版文件 格式 资源://模块@主题/控制器/操作
 * @param string $template 模版资源地址
 * @param string $layer 视图层(目录)名称
 * @return string
 */function T($template=&#39;&#39;,$layer=&#39;&#39;){


    // 解析模版资源地址
    if(false === strpos($template,&#39;://&#39;)){        $template   =   &#39;http://&#39;.str_replace(&#39;:&#39;, &#39;/&#39;,$template);
    }    $info   =   parse_url($template);    $file   =   $info[&#39;host&#39;].(isset($info[&#39;path&#39;])?$info[&#39;path&#39;]:&#39;&#39;);    
    $module =   isset($info[&#39;user&#39;])?$info[&#39;user&#39;].&#39;/&#39;:MODULE_NAME.&#39;/&#39;;    $extend =   $info[&#39;scheme&#39;];    
    $layer  =   $layer?$layer:C(&#39;DEFAULT_V_LAYER&#39;);    // 获取当前主题的模版路径
    $auto   =   C(&#39;AUTOLOAD_NAMESPACE&#39;);    if($auto && isset($auto[$extend])){ // 扩展资源
        $baseUrl    =   $auto[$extend].$module.$layer.&#39;/&#39;;
    }elseif(C(&#39;VIEW_PATH&#39;)){ 
        // 改变模块视图目录
        $baseUrl    =   C(&#39;VIEW_PATH&#39;);
    }elseif(defined(&#39;TMPL_PATH&#39;)){ 
        // 指定全局视图目录
        $baseUrl    =   TMPL_PATH.$module;
    }else{        $baseUrl    =   APP_PATH.$module.$layer.&#39;/&#39;;
    }    // 获取主题
    $theme  =   substr_count($file,&#39;/&#39;)<2 ? C(&#39;DEFAULT_THEME&#39;) : &#39;&#39;;    // 分析模板文件规则
    $depr   =   C(&#39;TMPL_FILE_DEPR&#39;);    if(&#39;&#39; == $file) {        // 如果模板文件名为空 按照默认规则定位
        $file = CONTROLLER_NAME . $depr . ACTION_NAME;
    }elseif(false === strpos($file, &#39;/&#39;)){        $file = CONTROLLER_NAME . $depr . $file;
    }elseif(&#39;/&#39; != $depr){        $file   =   substr_count($file,&#39;/&#39;)>1 ? substr_replace($file,$depr,strrpos($file,&#39;/&#39;),1) : str_replace(&#39;/&#39;, $depr, $file);
    }    return $baseUrl.($theme?$theme.&#39;/&#39;:&#39;&#39;).$file.C(&#39;TMPL_TEMPLATE_SUFFIX&#39;);
}/**
 * URL组装 支持不同URL模式
 * @param string $url URL表达式,格式:&#39;[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...&#39;
 * @param string|array $vars 传入的参数,支持数组和字符串
 * @param string|boolean $suffix 伪静态后缀,默认为true表示获取配置值
 * @param boolean $domain 是否显示域名
 * @return string
 */function U($url=&#39;&#39;,$vars=&#39;&#39;,$suffix=true,$domain=false) {
    // 解析URL
    $info   =  parse_url($url);    $url    =  !empty($info[&#39;path&#39;])?$info[&#39;path&#39;]:ACTION_NAME;    if(isset($info[&#39;fragment&#39;])) { // 解析锚点
        $anchor =   $info[&#39;fragment&#39;];        if(false !== strpos($anchor,&#39;?&#39;)) { // 解析参数
            list($anchor,$info[&#39;query&#39;]) = explode(&#39;?&#39;,$anchor,2);
        }        
        if(false !== strpos($anchor,&#39;@&#39;)) { // 解析域名
            list($anchor,$host)    =   explode(&#39;@&#39;,$anchor, 2);
        }
    }elseif(false !== strpos($url,&#39;@&#39;)) { // 解析域名
        list($url,$host)    =   explode(&#39;@&#39;,$info[&#39;path&#39;], 2);
    }    // 解析子域名
    if(isset($host)) {        $domain = $host.(strpos($host,&#39;.&#39;)?&#39;&#39;:strstr($_SERVER[&#39;HTTP_HOST&#39;],&#39;.&#39;));
    }elseif($domain===true){        $domain = $_SERVER[&#39;HTTP_HOST&#39;];        if(C(&#39;APP_SUB_DOMAIN_DEPLOY&#39;) ) { // 开启子域名部署
            $domain = $domain==&#39;localhost&#39;?&#39;localhost&#39;:&#39;www&#39;.strstr($_SERVER[&#39;HTTP_HOST&#39;],&#39;.&#39;);            // &#39;子域名&#39;=>array(&#39;模块[/控制器]&#39;);
            foreach (C(&#39;APP_SUB_DOMAIN_RULES&#39;) as $key => $rule) {                $rule   =   is_array($rule)?$rule[0]:$rule;                
            if(false === strpos($key,&#39;*&#39;) && 0=== strpos($url,$rule)) {                    $domain = $key.strstr($domain,&#39;.&#39;); // 生成对应子域名
                    $url    =  substr_replace($url,&#39;&#39;,0,strlen($rule));                    break;
                }
            }
        }
    }    // 解析参数
    if(is_string($vars)) { // aaa=1&bbb=2 转换成数组
        parse_str($vars,$vars);
    }elseif(!is_array($vars)){        $vars = array();
    }    if(isset($info[&#39;query&#39;])) { // 解析地址里面参数 合并到vars
        parse_str($info[&#39;query&#39;],$params);        $vars = array_merge($params,$vars);
    }    // URL组装
    $depr       =   C(&#39;URL_PATHINFO_DEPR&#39;);    $urlCase    =   C(&#39;URL_CASE_INSENSITIVE&#39;);    if($url) {        if(0=== strpos($url,&#39;/&#39;)) {// 定义路由
            $route      =   true;            $url        =   substr($url,1);            
            if(&#39;/&#39; != $depr) {                
            $url    =   str_replace(&#39;/&#39;,$depr,$url);
            }
        }else{            if(&#39;/&#39; != $depr) { // 安全替换
                $url    =   str_replace(&#39;/&#39;,$depr,$url);
            }            // 解析模块、控制器和操作
            $url        =   trim($url,$depr);            $path       =   explode($depr,$url);            
            $var        =   array();            $varModule      =   C(&#39;VAR_MODULE&#39;);            
            $varController  =   C(&#39;VAR_CONTROLLER&#39;);            
            $varAction      =   C(&#39;VAR_ACTION&#39;);            
            $var[$varAction]       =   !empty($path)?array_pop($path):ACTION_NAME;            
            $var[$varController]   =   !empty($path)?array_pop($path):CONTROLLER_NAME;            
            if($maps = C(&#39;URL_ACTION_MAP&#39;)) {                
            if(isset($maps[strtolower($var[$varController])])) {                   
            $maps    =   $maps[strtolower($var[$varController])];                   
             if($action = array_search(strtolower($var[$varAction]),$maps)){                        
             $var[$varAction] = $action;
                    }
                }
            }            if($maps = C(&#39;URL_CONTROLLER_MAP&#39;)) {                if($controller = array_search(strtolower($var[$varController]),$maps)){                    $var[$varController] = $controller;
                }
            }            if($urlCase) {                $var[$varController]   =   parse_name($var[$varController]);
            }            $module =   &#39;&#39;;            if(!empty($path)) {                $var[$varModule]    =   implode($depr,$path);
            }else{                if(C(&#39;MULTI_MODULE&#39;)) {                    if(MODULE_NAME != C(&#39;DEFAULT_MODULE&#39;) || !C(&#39;MODULE_ALLOW_LIST&#39;)){                        $var[$varModule]=   MODULE_NAME;
                    }
                }
            }            
            if($maps = C(&#39;URL_MODULE_MAP&#39;)) {                
            if($_module = array_search(strtolower($var[$varModule]),$maps)){                    
            $var[$varModule] = $_module;
                }
            }            if(isset($var[$varModule])){                $module =   $var[$varModule];                unset($var[$varModule]);
            }

        }
    }    if(C(&#39;URL_MODEL&#39;) == 0) { // 普通模式URL转换
        $url        =   __APP__.&#39;?&#39;.C(&#39;VAR_MODULE&#39;)."={$module}&".http_build_query(array_reverse($var));        
        if($urlCase){            $url    =   strtolower($url);
        }        
        if(!empty($vars)) {            $vars   =   http_build_query($vars);            $url   .=   &#39;&&#39;.$vars;
        }
    }else{ // PATHINFO模式或者兼容URL模式
        if(isset($route)) {            $url    =   __APP__.&#39;/&#39;.rtrim($url,$depr);
        }else{            $module =   (defined(&#39;BIND_MODULE&#39;) && BIND_MODULE==$module )? &#39;&#39; : $module;            
        $url    =   __APP__.&#39;/&#39;.($module?$module.MODULE_PATHINFO_DEPR:&#39;&#39;).implode($depr,array_reverse($var));
        }        if($urlCase){            $url    =   strtolower($url);
        }        if(!empty($vars)) { // 添加参数
            foreach ($vars as $var => $val){                if(&#39;&#39; !== trim($val))   $url .= $depr . $var . $depr . urlencode($val);
            }                
        }        if($suffix) {            $suffix   =  $suffix===true?C(&#39;URL_HTML_SUFFIX&#39;):$suffix;            
        if($pos = strpos($suffix, &#39;|&#39;)){                $suffix = substr($suffix, 0, $pos);
            }            if($suffix && &#39;/&#39; != substr($url,-1)){                $url  .=  &#39;.&#39;.ltrim($suffix,&#39;.&#39;);
            }
        }
    }    if(isset($anchor)){        $url  .= &#39;#&#39;.$anchor;
    }    if($domain) {        $url   =  (is_ssl()?&#39;https://&#39;:&#39;http://&#39;).$domain.$url;
    }    return $url;
}/**
 * 渲染输出Widget
 * @param string $name Widget名称
 * @param array $data 传入的参数
 * @return void
 */function W($name, $data=array()) {
    return R($name,$data,&#39;Widget&#39;);
}/**
 * 缓存管理
 * @param mixed $name 缓存名称,如果为数组表示进行缓存设置
 * @param mixed $value 缓存值
 * @param mixed $options 缓存参数
 * @return mixed
 */function S($name,$value=&#39;&#39;,$options=null) {
    static $cache   =   &#39;&#39;;    if(is_array($options)){        // 缓存操作的同时初始化
        $type       =   isset($options[&#39;type&#39;])?$options[&#39;type&#39;]:&#39;&#39;;        $cache      =   Think\Cache::getInstance($type,$options);
    }elseif(is_array($name)) { // 缓存初始化
        $type       =   isset($name[&#39;type&#39;])?$name[&#39;type&#39;]:&#39;&#39;;        $cache      =   Think\Cache::getInstance($type,$name);        return $cache;
    }elseif(empty($cache)) { // 自动初始化
        $cache      =   Think\Cache::getInstance();
    }    if(&#39;&#39;=== $value){ // 获取缓存
        return $cache->get($name);
    }elseif(is_null($value)) { // 删除缓存
        return $cache->rm($name);
    }else { // 缓存数据
        if(is_array($options)) {            $expire     =   isset($options[&#39;expire&#39;])?$options[&#39;expire&#39;]:NULL;
        }else{            $expire     =   is_numeric($options)?$options:NULL;
        }        return $cache->set($name, $value, $expire);
    }
}?>

           


<?php/////////////////////////////////////////////////////////A///////////////////////////////////////////////////////////////**
 * 实例化多层控制器 格式:[资源://][模块/]控制器
 * @param string $name 资源地址
 * @param string $layer 控制层名称
 * @param integer $level 控制器层次
 * @return Think\Controller|false
 */function A($name,$layer=&#39;&#39;,$level=0) {
    static $_action = array();    $layer  =   $layer? : C(&#39;DEFAULT_C_LAYER&#39;);    $level  =   $level? : ($layer == C(&#39;DEFAULT_C_LAYER&#39;)?C(&#39;CONTROLLER_LEVEL&#39;):1);   
     if(isset($_action[$name.$layer]))        return $_action[$name.$layer];    
     $class  =   parse_res_name($name,$layer,$level);    
     if(class_exists($class)) {        
     $action             =   new $class();        $_action[$name.$layer]     =   $action;        return $action;
    }else {        return false;
    }
}////////////////////////////////////////////////////////B////////////////////////////////////////////////////////////////**
 * 执行某个行为
 * @param string $name 行为名称
 * @param string $tag 标签名称(行为类无需传入) 
 * @param Mixed $params 传入的参数
 * @return void
 */function B($name, $tag=&#39;&#39;,&$params=NULL) {
    if(&#39;&#39;==$tag){        $name   .=  &#39;Behavior&#39;;
    }    return \Think\Hook::exec($name,$tag,$params);
}////////////////////////////////////////////////////////C////////////////////////////////////////////////////////////////**
 * 获取和设置配置参数 支持批量定义
 * @param string|array $name 配置变量
 * @param mixed $value 配置值
 * @param mixed $default 默认值
 * @return mixed
 */function C($name=null, $value=null,$default=null) {
    static $_config = array();    // 无参数时获取所有
    if (empty($name)) {        return $_config;
    }    // 优先执行设置获取或赋值
    if (is_string($name)) {        if (!strpos($name, &#39;.&#39;)) {            $name = strtoupper($name);            
    if (is_null($value))                return isset($_config[$name]) ? $_config[$name] : $default;            
    $_config[$name] = $value;            return null;
        }        // 二维数组设置和获取支持
        $name = explode(&#39;.&#39;, $name);        $name[0]   =  strtoupper($name[0]);        if (is_null($value))            
        return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : $default;        
        $_config[$name[0]][$name[1]] = $value;        
        return null;
    }    // 批量设置
    if (is_array($name)){        $_config = array_merge($_config, array_change_key_case($name,CASE_UPPER));        return null;
    }    return null; // 避免非法参数}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
 * 实例化模型类 格式 [资源://][模块/]模型
 * @param string $name 资源地址
 * @param string $layer 模型层名称
 * @return Think\Model
 */function D($name=&#39;&#39;,$layer=&#39;&#39;) {
    if(empty($name)) return new Think\Model;    static $_model  =   array();    $layer          =   $layer? : C(&#39;DEFAULT_M_LAYER&#39;);    
    if(isset($_model[$name.$layer]))        return $_model[$name.$layer];    $class          =   parse_res_name($name,$layer);    
    if(class_exists($class)) {        $model      =   new $class(basename($name));
    }elseif(false === strpos($name,&#39;/&#39;)){        // 自动加载公共模块下面的模型
        if(!C(&#39;APP_USE_NAMESPACE&#39;)){
            import(&#39;Common/&#39;.$layer.&#39;/&#39;.$class);
        }else{            $class      =   &#39;\\Common\\&#39;.$layer.&#39;\\&#39;.$name.$layer;
        }        $model      =   class_exists($class)? new $class($name) : new Think\Model($name);
    }else {
        Think\Log::record(&#39;D方法实例化没找到模型类&#39;.$class,Think\Log::NOTICE);        $model      =   new Think\Model(basename($name));
    }    $_model[$name.$layer]  =  $model;    return $model;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
 * 抛出异常处理
 * @param string $msg 异常消息
 * @param integer $code 异常代码 默认为0
 * @throws Think\Exception
 * @return void
 */function E($msg, $code=0) {
    throw new Think\Exception($msg, $code);
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
 * 快速文件数据读取和保存 针对简单类型数据 字符串、数组
 * @param string $name 缓存名称
 * @param mixed $value 缓存值
 * @param string $path 缓存路径
 * @return mixed
 */function F($name, $value=&#39;&#39;, $path=DATA_PATH) {
    static $_cache  =   array();    $filename       =   $path . $name . &#39;.php&#39;;    if (&#39;&#39; !== $value) {        if (is_null($value)) {            // 删除缓存
            if(false !== strpos($name,&#39;*&#39;)){                return false; // TODO 
            }else{                unset($_cache[$name]);                return Think\Storage::unlink($filename,&#39;F&#39;);
            }
        } else {
            Think\Storage::put($filename,serialize($value),&#39;F&#39;);            // 缓存数据
            $_cache[$name]  =   $value;            return null;
        }
    }    // 获取缓存数据
    if (isset($_cache[$name]))        return $_cache[$name];    
    if (Think\Storage::has($filename,&#39;F&#39;)){        $value      =   unserialize(Think\Storage::read($filename,&#39;F&#39;));        $_cache[$name]  =   $value;
    } else {        $value          =   false;
    }    return $value;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
 * 记录和统计时间(微秒)和内存使用情况
 * 使用方法:
 * <code>
 * G(&#39;begin&#39;); // 记录开始标记位
 * // ... 区间运行代码
 * G(&#39;end&#39;); // 记录结束标签位
 * echo G(&#39;begin&#39;,&#39;end&#39;,6); // 统计区间运行时间 精确到小数后6位
 * echo G(&#39;begin&#39;,&#39;end&#39;,&#39;m&#39;); // 统计区间内存使用情况
 * 如果end标记位没有定义,则会自动以当前作为标记位
 * 其中统计内存使用需要 MEMORY_LIMIT_ON 常量为true才有效
 * </code>
 * @param string $start 开始标签
 * @param string $end 结束标签
 * @param integer|string $dec 小数位或者m
 * @return mixed
 */function G($start,$end=&#39;&#39;,$dec=4) {
    static $_info       =   array();    static $_mem        =   array();    if(is_float($end)) { // 记录时间
        $_info[$start]  =   $end;
    }elseif(!empty($end)){ // 统计时间和内存使用
        if(!isset($_info[$end])) $_info[$end]       =  microtime(TRUE);        
        if(MEMORY_LIMIT_ON && $dec==&#39;m&#39;){            
        if(!isset($_mem[$end])) $_mem[$end]     =  memory_get_usage();            return number_format(($_mem[$end]-$_mem[$start])/1024);
        }else{            return number_format(($_info[$end]-$_info[$start]),$dec);
        }


    }else{ // 记录时间和内存使用
        $_info[$start]  =  microtime(TRUE);        if(MEMORY_LIMIT_ON) $_mem[$start]           =  memory_get_usage();
    }    return null;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
 * 获取输入参数 支持过滤和默认值
 * 使用方法:
 * <code>
 * I(&#39;id&#39;,0); 获取id参数 自动判断get或者post
 * I(&#39;post.name&#39;,&#39;&#39;,&#39;htmlspecialchars&#39;); 获取$_POST[&#39;name&#39;]
 * I(&#39;get.&#39;); 获取$_GET
 * </code>
 * @param string $name 变量的名称 支持指定类型
 * @param mixed $default 不存在的时候默认值
 * @param mixed $filter 参数过滤方法
 * @param mixed $datas 要获取的额外数据源
 * @return mixed
 */function I($name,$default=&#39;&#39;,$filter=null,$datas=null) {
    static $_PUT    =   null;    if(strpos($name,&#39;/&#39;)){ // 指定修饰符
        list($name,$type)   =   explode(&#39;/&#39;,$name,2);
    }elseif(C(&#39;VAR_AUTO_STRING&#39;)){ // 默认强制转换为字符串
        $type   =   &#39;s&#39;;
    }    if(strpos($name,&#39;.&#39;)) { // 指定参数来源
        list($method,$name) =   explode(&#39;.&#39;,$name,2);
    }else{ // 默认为自动判断
        $method =   &#39;param&#39;;
    }    switch(strtolower($method)) {        case &#39;get&#39;     :   
            $input =& $_GET;            break;        case &#39;post&#39;    :   
            $input =& $_POST;            break;        case &#39;put&#39;     :   
            if(is_null($_PUT)){
                parse_str(file_get_contents(&#39;php://input&#39;), $_PUT);
            }            $input  =   $_PUT;        
            break;        case &#39;param&#39;   :            switch($_SERVER[&#39;REQUEST_METHOD&#39;]) {                case &#39;POST&#39;:                    $input  =  $_POST;                    break;                case &#39;PUT&#39;:                    if(is_null($_PUT)){
                        parse_str(file_get_contents(&#39;php://input&#39;), $_PUT);
                    }                    $input  =   $_PUT;                    break;                default:                    $input  =  $_GET;
            }            break;        case &#39;path&#39;    :   
            $input  =   array();            
            if(!empty($_SERVER[&#39;PATH_INFO&#39;])){                
            $depr   =   C(&#39;URL_PATHINFO_DEPR&#39;);                $input  =   explode($depr,trim($_SERVER[&#39;PATH_INFO&#39;],$depr));            
            }            break;        case &#39;request&#39; :   
            $input =& $_REQUEST;   
            break;        case &#39;session&#39; :   
            $input =& $_SESSION;   
            break;        case &#39;cookie&#39;  :   
            $input =& $_COOKIE;    
            break;        case &#39;server&#39;  :   
            $input =& $_SERVER;    
            break;        case &#39;globals&#39; :   
            $input =& $GLOBALS;    
            break;        case &#39;data&#39;    :   
            $input =& $datas;      
            break;        default:            return null;
    }    if(&#39;&#39;==$name) { // 获取全部变量
        $data       =   $input;        $filters    =   isset($filter)?$filter:C(&#39;DEFAULT_FILTER&#39;);        if($filters) {            if(is_string($filters)){                $filters    =   explode(&#39;,&#39;,$filters);
            }            foreach($filters as $filter){                $data   =   array_map_recursive($filter,$data); // 参数过滤
            }
        }
    }elseif(isset($input[$name])) { // 取值操作
        $data       =   $input[$name];        $filters    =   isset($filter)?$filter:C(&#39;DEFAULT_FILTER&#39;);        if($filters) {            
        if(is_string($filters)){                if(0 === strpos($filters,&#39;/&#39;)){                    if(1 !== preg_match($filters,(string)$data)){                        // 支持正则验证
                        return   isset($default) ? $default : null;
                    }
                }else{                    $filters    =   explode(&#39;,&#39;,$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 &#39;a&#39;:   // 数组
                    $data   =   (array)$data;                    break;                case &#39;d&#39;:   // 数字
                    $data   =   (int)$data;                    break;                case &#39;f&#39;:   // 浮点
                    $data   =   (float)$data;                    break;                case &#39;b&#39;:   // 布尔
                    $data   =   (boolean)$data;                    break;                case &#39;s&#39;:   // 字符串
                default:                    $data   =   (string)$data;
            }
        }
    }else{ // 变量默认值
        $data       =    isset($default)?$default:null;
    }
    is_array($data) && array_walk_recursive($data,&#39;think_filter&#39;);    return $data;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
 * 获取和设置语言定义(不区分大小写)
 * @param string|array $name 语言变量
 * @param mixed $value 语言值或者变量
 * @return mixed
 */function L($name=null, $value=null) {
    static $_lang = array();    // 空参数返回所有定义
    if (empty($name))        return $_lang;    // 判断语言获取(或设置)
    // 若不存在,直接返回全大写$name
    if (is_string($name)) {        $name   =   strtoupper($name);        if (is_null($value)){            return isset($_lang[$name]) ? $_lang[$name] : $name;
        }elseif(is_array($value)){            // 支持变量
            $replace = array_keys($value);            foreach($replace as &$v){                $v = &#39;{$&#39;.$v.&#39;}&#39;;
            }            return str_replace($replace,$value,isset($_lang[$name]) ? $_lang[$name] : $name);        
        }        $_lang[$name] = $value; // 语言定义
        return null;
    }    // 批量定义
    if (is_array($name))        $_lang = array_merge($_lang, array_change_key_case($name, CASE_UPPER));    return null;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
 * 实例化一个没有模型文件的Model
 * @param string $name Model名称 支持指定基础模型 例如 MongoModel:User
 * @param string $tablePrefix 表前缀
 * @param mixed $connection 数据库连接信息
 * @return Think\Model
 */function M($name=&#39;&#39;, $tablePrefix=&#39;&#39;,$connection=&#39;&#39;) {
    static $_model  = array();    if(strpos($name,&#39;:&#39;)) {        list($class,$name)    =  explode(&#39;:&#39;,$name);
    }else{        $class      =   &#39;Think\\Model&#39;;
    }    $guid           =   (is_array($connection)?implode(&#39;&#39;,$connection):$connection).$tablePrefix . $name . &#39;_&#39; . $class;    
    if (!isset($_model[$guid]))        $_model[$guid] = new $class($name,$tablePrefix,$connection);    return $_model[$guid];
}/**
 * 设置和获取统计数据
 * 使用方法:
 * <code>
 * N(&#39;db&#39;,1); // 记录数据库操作次数
 * N(&#39;read&#39;,1); // 记录读取次数
 * echo N(&#39;db&#39;); // 获取当前页面数据库的所有操作次数
 * echo N(&#39;read&#39;); // 获取当前页面读取次数
 * </code>
 * @param string $key 标识位置
 * @param integer $step 步进值
 * @param boolean $save 是否保存结果
 * @return mixed
 */function N($key, $step=0,$save=false) {
    static $_num    = array();    if (!isset($_num[$key])) {        $_num[$key] = (false !== $save)? S(&#39;N_&#39;.$key) :  0;
    }    if (empty($step)){        return $_num[$key];
    }else{        $_num[$key] = $_num[$key] + (int)$step;
    }    if(false !== $save){ // 保存结果
        S(&#39;N_&#39;.$key,$_num[$key],$save);
    }    return null;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
 * 远程调用控制器的操作方法 URL 参数格式 [资源://][模块/]控制器/操作
 * @param string $url 调用地址
 * @param string|array $vars 调用参数 支持字符串和数组
 * @param string $layer 要调用的控制层名称
 * @return mixed
 */function R($url,$vars=array(),$layer=&#39;&#39;) {
    $info   =   pathinfo($url);    $action =   $info[&#39;basename&#39;];    $module =   $info[&#39;dirname&#39;];    $class  =   A($module,$layer);    
    if($class){        if(is_string($vars)) {
            parse_str($vars,$vars);
        }        return call_user_func_array(array(&$class,$action.C(&#39;ACTION_SUFFIX&#39;)),$vars);
    }else{        return false;
    }
}/**
 * 获取模版文件 格式 资源://模块@主题/控制器/操作
 * @param string $template 模版资源地址
 * @param string $layer 视图层(目录)名称
 * @return string
 */function T($template=&#39;&#39;,$layer=&#39;&#39;){


    // 解析模版资源地址
    if(false === strpos($template,&#39;://&#39;)){        $template   =   &#39;http://&#39;.str_replace(&#39;:&#39;, &#39;/&#39;,$template);
    }    $info   =   parse_url($template);    $file   =   $info[&#39;host&#39;].(isset($info[&#39;path&#39;])?$info[&#39;path&#39;]:&#39;&#39;);    
    $module =   isset($info[&#39;user&#39;])?$info[&#39;user&#39;].&#39;/&#39;:MODULE_NAME.&#39;/&#39;;    $extend =   $info[&#39;scheme&#39;];    
    $layer  =   $layer?$layer:C(&#39;DEFAULT_V_LAYER&#39;);    // 获取当前主题的模版路径
    $auto   =   C(&#39;AUTOLOAD_NAMESPACE&#39;);    if($auto && isset($auto[$extend])){ // 扩展资源
        $baseUrl    =   $auto[$extend].$module.$layer.&#39;/&#39;;
    }elseif(C(&#39;VIEW_PATH&#39;)){ 
        // 改变模块视图目录
        $baseUrl    =   C(&#39;VIEW_PATH&#39;);
    }elseif(defined(&#39;TMPL_PATH&#39;)){ 
        // 指定全局视图目录
        $baseUrl    =   TMPL_PATH.$module;
    }else{        $baseUrl    =   APP_PATH.$module.$layer.&#39;/&#39;;
    }    // 获取主题
    $theme  =   substr_count($file,&#39;/&#39;)<2 ? C(&#39;DEFAULT_THEME&#39;) : &#39;&#39;;    // 分析模板文件规则
    $depr   =   C(&#39;TMPL_FILE_DEPR&#39;);    if(&#39;&#39; == $file) {        // 如果模板文件名为空 按照默认规则定位
        $file = CONTROLLER_NAME . $depr . ACTION_NAME;
    }elseif(false === strpos($file, &#39;/&#39;)){        $file = CONTROLLER_NAME . $depr . $file;
    }elseif(&#39;/&#39; != $depr){        $file   =   substr_count($file,&#39;/&#39;)>1 ? substr_replace($file,$depr,strrpos($file,&#39;/&#39;),1) : str_replace(&#39;/&#39;, $depr, $file);
    }    return $baseUrl.($theme?$theme.&#39;/&#39;:&#39;&#39;).$file.C(&#39;TMPL_TEMPLATE_SUFFIX&#39;);
}/**
 * URL组装 支持不同URL模式
 * @param string $url URL表达式,格式:&#39;[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...&#39;
 * @param string|array $vars 传入的参数,支持数组和字符串
 * @param string|boolean $suffix 伪静态后缀,默认为true表示获取配置值
 * @param boolean $domain 是否显示域名
 * @return string
 */function U($url=&#39;&#39;,$vars=&#39;&#39;,$suffix=true,$domain=false) {
    // 解析URL
    $info   =  parse_url($url);    $url    =  !empty($info[&#39;path&#39;])?$info[&#39;path&#39;]:ACTION_NAME;    if(isset($info[&#39;fragment&#39;])) { // 解析锚点
        $anchor =   $info[&#39;fragment&#39;];        if(false !== strpos($anchor,&#39;?&#39;)) { // 解析参数
            list($anchor,$info[&#39;query&#39;]) = explode(&#39;?&#39;,$anchor,2);
        }        
        if(false !== strpos($anchor,&#39;@&#39;)) { // 解析域名
            list($anchor,$host)    =   explode(&#39;@&#39;,$anchor, 2);
        }
    }elseif(false !== strpos($url,&#39;@&#39;)) { // 解析域名
        list($url,$host)    =   explode(&#39;@&#39;,$info[&#39;path&#39;], 2);
    }    // 解析子域名
    if(isset($host)) {        $domain = $host.(strpos($host,&#39;.&#39;)?&#39;&#39;:strstr($_SERVER[&#39;HTTP_HOST&#39;],&#39;.&#39;));
    }elseif($domain===true){        $domain = $_SERVER[&#39;HTTP_HOST&#39;];        if(C(&#39;APP_SUB_DOMAIN_DEPLOY&#39;) ) { // 开启子域名部署
            $domain = $domain==&#39;localhost&#39;?&#39;localhost&#39;:&#39;www&#39;.strstr($_SERVER[&#39;HTTP_HOST&#39;],&#39;.&#39;);            // &#39;子域名&#39;=>array(&#39;模块[/控制器]&#39;);
            foreach (C(&#39;APP_SUB_DOMAIN_RULES&#39;) as $key => $rule) {                $rule   =   is_array($rule)?$rule[0]:$rule;                
            if(false === strpos($key,&#39;*&#39;) && 0=== strpos($url,$rule)) {                    $domain = $key.strstr($domain,&#39;.&#39;); // 生成对应子域名
                    $url    =  substr_replace($url,&#39;&#39;,0,strlen($rule));                    break;
                }
            }
        }
    }    // 解析参数
    if(is_string($vars)) { // aaa=1&bbb=2 转换成数组
        parse_str($vars,$vars);
    }elseif(!is_array($vars)){        $vars = array();
    }    if(isset($info[&#39;query&#39;])) { // 解析地址里面参数 合并到vars
        parse_str($info[&#39;query&#39;],$params);        $vars = array_merge($params,$vars);
    }    // URL组装
    $depr       =   C(&#39;URL_PATHINFO_DEPR&#39;);    $urlCase    =   C(&#39;URL_CASE_INSENSITIVE&#39;);    if($url) {        if(0=== strpos($url,&#39;/&#39;)) {// 定义路由
            $route      =   true;            $url        =   substr($url,1);            
            if(&#39;/&#39; != $depr) {                $url    =   str_replace(&#39;/&#39;,$depr,$url);
            }
        }else{            if(&#39;/&#39; != $depr) { // 安全替换
                $url    =   str_replace(&#39;/&#39;,$depr,$url);
            }            // 解析模块、控制器和操作
            $url        =   trim($url,$depr);            $path       =   explode($depr,$url);            $var        =   array();            
            $varModule      =   C(&#39;VAR_MODULE&#39;);            $varController  =   C(&#39;VAR_CONTROLLER&#39;);            
            $varAction      =   C(&#39;VAR_ACTION&#39;);            $var[$varAction]       =   !empty($path)?array_pop($path):ACTION_NAME;            
            $var[$varController]   =   !empty($path)?array_pop($path):CONTROLLER_NAME;            
            if($maps = C(&#39;URL_ACTION_MAP&#39;)) {                
            if(isset($maps[strtolower($var[$varController])])) {                    
            $maps    =   $maps[strtolower($var[$varController])];                   
             if($action = array_search(strtolower($var[$varAction]),$maps)){                        $var[$varAction] = $action;
                    }
                }
            }            if($maps = C(&#39;URL_CONTROLLER_MAP&#39;)) {                if($controller = array_search(strtolower($var[$varController]),$maps)){                    $var[$varController] = $controller;
                }
            }            if($urlCase) {                $var[$varController]   =   parse_name($var[$varController]);
            }            $module =   &#39;&#39;;            if(!empty($path)) {                $var[$varModule]    =   implode($depr,$path);
            }else{                if(C(&#39;MULTI_MODULE&#39;)) {                    if(MODULE_NAME != C(&#39;DEFAULT_MODULE&#39;) || !C(&#39;MODULE_ALLOW_LIST&#39;)){                        $var[$varModule]=   MODULE_NAME;
                    }
                }
            }            if($maps = C(&#39;URL_MODULE_MAP&#39;)) {                
            if($_module = array_search(strtolower($var[$varModule]),$maps)){                    $var[$varModule] = $_module;
                }
            }            if(isset($var[$varModule])){                $module =   $var[$varModule];                unset($var[$varModule]);
            }

        }
    }    if(C(&#39;URL_MODEL&#39;) == 0) { // 普通模式URL转换
        $url        =   __APP__.&#39;?&#39;.C(&#39;VAR_MODULE&#39;)."={$module}&".http_build_query(array_reverse($var));        
        if($urlCase){            $url    =   strtolower($url);
        }        
        if(!empty($vars)) {            $vars   =   http_build_query($vars);            $url   .=   &#39;&&#39;.$vars;
        }
    }else{ // PATHINFO模式或者兼容URL模式
        if(isset($route)) {            $url    =   __APP__.&#39;/&#39;.rtrim($url,$depr);
        }else{            $module =   (defined(&#39;BIND_MODULE&#39;) && BIND_MODULE==$module )? &#39;&#39; : $module;            
        $url    =   __APP__.&#39;/&#39;.($module?$module.MODULE_PATHINFO_DEPR:&#39;&#39;).implode($depr,array_reverse($var));
        }        if($urlCase){            $url    =   strtolower($url);
        }        if(!empty($vars)) { // 添加参数
            foreach ($vars as $var => $val){                if(&#39;&#39; !== trim($val))   $url .= $depr . $var . $depr . urlencode($val);
            }                
        }        if($suffix) {            $suffix   =  $suffix===true?C(&#39;URL_HTML_SUFFIX&#39;):$suffix;            
        if($pos = strpos($suffix, &#39;|&#39;)){                $suffix = substr($suffix, 0, $pos);
            }            if($suffix && &#39;/&#39; != substr($url,-1)){                $url  .=  &#39;.&#39;.ltrim($suffix,&#39;.&#39;);
            }
        }
    }    if(isset($anchor)){        $url  .= &#39;#&#39;.$anchor;
    }    if($domain) {        $url   =  (is_ssl()?&#39;https://&#39;:&#39;http://&#39;).$domain.$url;
    }    return $url;
}/**
 * 渲染输出Widget
 * @param string $name Widget名称
 * @param array $data 传入的参数
 * @return void
 */function W($name, $data=array()) {
    return R($name,$data,&#39;Widget&#39;);
}/**
 * 缓存管理
 * @param mixed $name 缓存名称,如果为数组表示进行缓存设置
 * @param mixed $value 缓存值
 * @param mixed $options 缓存参数
 * @return mixed
 */function S($name,$value=&#39;&#39;,$options=null) {
    static $cache   =   &#39;&#39;;    if(is_array($options)){        // 缓存操作的同时初始化
        $type       =   isset($options[&#39;type&#39;])?$options[&#39;type&#39;]:&#39;&#39;;        $cache      =   Think\Cache::getInstance($type,$options);
    }elseif(is_array($name)) { // 缓存初始化
        $type       =   isset($name[&#39;type&#39;])?$name[&#39;type&#39;]:&#39;&#39;;        $cache      =   Think\Cache::getInstance($type,$name);        return $cache;
    }elseif(empty($cache)) { // 自动初始化
        $cache      =   Think\Cache::getInstance();
    }    if(&#39;&#39;=== $value){ // 获取缓存
        return $cache->get($name);
    }elseif(is_null($value)) { // 删除缓存
        return $cache->rm($name);
    }else { // 缓存数据
        if(is_array($options)) {            $expire     =   isset($options[&#39;expire&#39;])?$options[&#39;expire&#39;]:NULL;
        }else{            $expire     =   is_numeric($options)?$options:NULL;
        }        return $cache->set($name, $value, $expire);
    }
}?>

相关推荐:

 thinkphp的 I()方法在其他php上调用

以上がThinkPHP レター関数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。