zoukankan      html  css  js  c++  java
  • 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 ] )

  • 相关阅读:
    VMware Workstation 14 Pro永久激活密钥
    maven属性、profile、资源过滤、不同环境构建项目
    控制返回前台字段
    jsonp 返回以前必须要再转一次json
    doPost方法不支持 a 标签和地址栏直接输入地址访问
    设置响应头控制浏览器的缓存
    获取请求头、设置响应头、设置缓冲区
    重定向与错误发送
    文件下载
    web 应用响应乱码问题
  • 原文地址:https://www.cnblogs.com/feng003/p/3503041.html
Copyright © 2011-2022 走看看