ThinkPHP3.2学习(三)

        感觉看一个框架没有入手点。只能拿自己用过3.1.3版本中熟悉的东西,比如函数(U、I、S、import、vendor)以及类库(DB、Upload、Verify)等这些东西,贴一遍代码,自己一点一点的分析了。

  1 function U($url='',$vars='',$suffix=true,$domain=false) {
  2     // 解析URL
  3     $info   =  parse_url($url);
  4     $url    =  !empty($info['path'])?$info['path']:ACTION_NAME;
  5     if(isset($info['fragment'])) { // 解析锚点
  6         $anchor =   $info['fragment'];
  7         if(false !== strpos($anchor,'?')) { // 解析参数
  8             list($anchor,$info['query']) = explode('?',$anchor,2);
  9         }        
 10         if(false !== strpos($anchor,'@')) { // 解析域名
 11             list($anchor,$host)    =   explode('@',$anchor, 2);
 12         }
 13     }elseif(false !== strpos($url,'@')) { // 解析域名
 14         list($url,$host)    =   explode('@',$info['path'], 2);
 15     }
 16     // 解析子域名
 17     if(isset($host)) {
 18         $domain = $host.(strpos($host,'.')?'':strstr($_SERVER['HTTP_HOST'],'.'));
 19     }elseif($domain===true){
 20         $domain = $_SERVER['HTTP_HOST'];
 21         if(C('APP_SUB_DOMAIN_DEPLOY') ) { // 开启子域名部署
 22             $domain = $domain=='localhost'?'localhost':'www'.strstr($_SERVER['HTTP_HOST'],'.');
 23             // '子域名'=>array('模块[/控制器]');
 24             foreach (C('APP_SUB_DOMAIN_RULES') as $key => $rule) {
 25                 $rule   =   is_array($rule)?$rule[0]:$rule;
 26                 if(false === strpos($key,'*') && 0=== strpos($url,$rule)) {
 27                     $domain = $key.strstr($domain,'.'); // 生成对应子域名
 28                     $url    =  substr_replace($url,'',0,strlen($rule));
 29                     break;
 30                 }
 31             }
 32         }
 33     }
 34 
 35     // 解析参数
 36     if(is_string($vars)) { // aaa=1&bbb=2 转换成数组
 37         parse_str($vars,$vars);
 38     }elseif(!is_array($vars)){
 39         $vars = array();
 40     }
 41     if(isset($info['query'])) { // 解析地址里面参数 合并到vars
 42         parse_str($info['query'],$params);
 43         $vars = array_merge($params,$vars);
 44     }
 45     
 46     // URL组装
 47     $depr = C('URL_PATHINFO_DEPR');
 48     if($url) {
 49         if(0=== strpos($url,'/')) {// 定义路由
 50             $route      =   true;
 51             $url        =   substr($url,1);
 52             if('/' != $depr) {
 53                 $url    =   str_replace('/',$depr,$url);
 54             }
 55         }else{
 56             if('/' != $depr) { // 安全替换
 57                 $url    =   str_replace('/',$depr,$url);
 58             }
 59             // 解析模块、控制器和操作
 60             $url        =   trim($url,$depr);
 61             $path       =   explode($depr,$url);
 62             $var        =   array();
 63             $var[C('VAR_ACTION')]       =   !empty($path)?array_pop($path):ACTION_NAME;
 64             $var[C('VAR_CONTROLLER')]   =   !empty($path)?array_pop($path):CONTROLLER_NAME;
 65             if($maps = C('URL_ACTION_MAP')) {
 66                 if(isset($maps[strtolower($var[C('VAR_CONTROLLER')])])) {
 67                     $maps    =   $maps[strtolower($var[C('VAR_CONTROLLER')])];
 68                     if($action = array_search(strtolower($var[C('VAR_ACTION')]),$maps)){
 69                         $var[C('VAR_ACTION')] = $action;
 70                     }
 71                 }
 72             }
 73             if($maps = C('URL_CONTROLLER_MAP')) {
 74                 if($controller = array_search(strtolower($var[C('VAR_CONTROLLER')]),$maps)){
 75                     $var[C('VAR_CONTROLLER')] = $controller;
 76                 }
 77             }
 78             if(C('URL_CASE_INSENSITIVE')) {
 79                 $var[C('VAR_CONTROLLER')]   =   parse_name($var[C('VAR_CONTROLLER')]);
 80             }
 81             $module =   '';
 82             
 83             if(!empty($path)) {
 84                 $var[C('VAR_MODULE')]    =   array_pop($path);
 85             }else{
 86                 if(C('MULTI_MODULE')) {
 87                     if(MODULE_NAME != C('DEFAULT_MODULE') || !C('MODULE_ALLOW_LIST')){
 88                         $var[C('VAR_MODULE')]=   MODULE_NAME;
 89                     }
 90                 }
 91             }
 92             if($maps = C('URL_MODULE_MAP')) {
 93                 if($_module = array_search(strtolower($var[C('VAR_MODULE')]),$maps)){
 94                     $var[C('VAR_MODULE')] = $_module;
 95                 }
 96             }
 97             if(isset($var[C('VAR_MODULE')])){
 98                 $module =   $var[C('VAR_MODULE')];
 99                 unset($var[C('VAR_MODULE')]);
100             }
101             
102         }
103     }
104 
105     if(C('URL_MODEL') == 0) { // 普通模式URL转换
106         $url        =   __APP__.'?'.C('VAR_MODULE')."={$module}&".http_build_query(array_reverse($var));
107         if(C('URL_CASE_INSENSITIVE')){
108             $url    =   strtolower($url);
109         }        
110         if(!empty($vars)) {
111             $vars   =   http_build_query($vars);
112             $url   .=   '&'.$vars;
113         }
114     }else{ // PATHINFO模式或者兼容URL模式
115         $module =   defined('BIND_MODULE') ? '' : $module;
116         if(isset($route)) {
117             $url    =   __APP__.'/'.($module?$module.MODULE_PATHINFO_DEPR:'').rtrim($url,$depr);
118         }else{
119             $url    =   __APP__.'/'.($module?$module.MODULE_PATHINFO_DEPR:'').implode($depr,array_reverse($var));
120         }
121         if(C('URL_CASE_INSENSITIVE')){
122             $url    =   strtolower($url);
123         }
124         if(!empty($vars)) { // 添加参数
125             foreach ($vars as $var => $val){
126                 if('' !== trim($val))   $url .= $depr . $var . $depr . urlencode($val);
127             }                
128         }
129         if($suffix) {
130             $suffix   =  $suffix===true?C('URL_HTML_SUFFIX'):$suffix;
131             if($pos = strpos($suffix, '|')){
132                 $suffix = substr($suffix, 0, $pos);
133             }
134             if($suffix && '/' != substr($url,-1)){
135                 $url  .=  '.'.ltrim($suffix,'.');
136             }
137         }
138     }
139     if(isset($anchor)){
140         $url  .= '#'.$anchor;
141     }
142     if($domain) {
143         $url   =  (is_ssl()?'https://':'http://').$domain.$url;
144     }
145     return $url;
146 }
View Code

U函数 ,官方给的解释:

U($url='',$var='',$suffix=true,$domain=false)
/**
 * URL组装 支持不同URL模式
 * @param string $url URL表达式,格式:'[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...'
 * @param string|array $vars 传入的参数,支持数组和字符串
 * @param string $suffix 伪静态后缀,默认为true表示获取配置值
 * @param boolean $domain 是否显示域名
 * @return string
 */

感觉这个是在项目中应用比较多的一个。毕竟a标签太多了。

parse_str($vars,$vars);函数把查询字符串解析到变量中。void parse_str(string,array)

 array_merge($params,$vars);合并一个或多个数组 。 array array_merge ( array $array1 [, array $... ] )

 'URL_PATHINFO_DEPR'     =>  '/',    // PATHINFO模式下,各参数之间的分割符号

strpos($url,'/') ;查找字符串首次出现的位置。   int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )

substr($url,1);返回字符串的子串string substr ( string $string , int $start [, int $length ] )

trim($url,$depr);去除字符串首尾处的空白字符(或者其他字符)string trim ( string $str [, string $charlist ] )

explode($depr,$url);使用一个字符串分割另一个字符串array explode ( string $delimiter , string $string [, int $limit ] )

原文地址:https://www.cnblogs.com/feng003/p/3503041.html