感觉看一个框架没有入手点。只能拿自己用过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 }
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
] )