亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

[李景山php]thinkphp核心源碼注釋-Route.class.php

2020-03-22 17:49:52
字體:
來源:轉載
供稿:網友
  • <?php// +----------------------------------------------------------------------// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]// +----------------------------------------------------------------------// | Copyright (c) 2006-2014 http://thinkVeVb.com All rights reserved.// +----------------------------------------------------------------------// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )// +----------------------------------------------------------------------// | Author: liu21st <liu21st@gmail.com>// +----------------------------------------------------------------------namespace Think;/** * ThinkPHP路由解析類 * 又是個解析了,哈哈 */html' target='_blank'>class Route {    // 路由檢測    // 大哥,不就檢測個路由嗎,不能簡單點嗎    public static function check(){        $depr   =   C('URL_PATHINFO_DEPR'); //  又是這個分隔符號        $regx   =   preg_replace('//.'.__EXT__.'$/i','',trim($_SERVER['PATH_INFO'],$depr));// 踢出出去了        // 分隔符替換 確保路由定義使用統一的分隔符        if('/' != $depr){ // 如果分隔符            $regx = str_replace($depr,'/',$regx); // 這里替換了  變成了 / 里面了        }        // URL映射定義(靜態路由)        $maps   =   C('URL_MAP_RULES'); // 這里 應該 沒什么呢  'URL_MAP_RULES'         =>  array(), // URL映射定義規則        if(isset($maps[$regx])) { // 如果設置了,對應的路由規則了  這里是 特殊的路由了            $var    =   self::parseUrl($maps[$regx]);// 這里的變成變量了            $_GET   =   array_merge($var, $_GET);// 合并了 的變量了            return true;                // 這個就返回了啊,        }                // 動態路由處理        $routes =   C('URL_ROUTE_RULES'); // 'URL_ROUTE_RULES'       =>  array(), // 默認路由規則 針對模塊        if(!empty($routes)) {// 這里 不為空,其實 是空的            foreach ($routes as $rule=>$route){ // 這里才是 開始了 嘿嘿                if(is_numeric($rule)){// 如果是 數字                    // 支持 array('rule','adddress',...) 定義路由                    $rule   =   array_shift($route); // 這里 踢出出來了, 其實,你對你輸入格式 變成了                }                if(is_array($route) && isset($route[2])){// 如果 是 數組 并且 規則 不一樣呢                    // 路由參數                    $options    =   $route[2]; // 進行參數開始                    if(isset($options['ext']) && __EXT__ != $options['ext']){                        // URL后綴檢測                        continue;// URL 后綴                    }                    if(isset($options['method']) && REQUEST_METHOD != strtoupper($options['method'])){                        // 請求類型檢測                        continue; // 進行方法 進行 轉化                    }                    // 自定義檢測                    if(!empty($options['callback']) && is_callable($options['callback'])) {                        if(false === call_user_func($options['callback'])) {                            continue;                        }                    }                                    }                if(0===strpos($rule,'/') && preg_match($rule,$regx,$matches)) { // 正則路由                    if($route instanceof /Closure) {                        // 執行閉包  規則的 的一個轉換                        $result = self::invokeRegx($route, $matches);                        // 如果返回布爾值 則繼續執行                        return is_bool($result) ? $result : exit;                    }else{                        return self::parseRegex($matches,$route,$regx);                    }                }else{ // 規則路由                    $len1   =   substr_count($regx,'/');                    $len2   =   substr_count($rule,'/');                    if($len1>=$len2 || strpos($rule,'[')) {                        if('$' == substr($rule,-1,1)) {// 完整匹配                            if($len1 != $len2) {                                continue;                            }else{                                $rule =  substr($rule,0,-1);                            }                        }                        $match  =  self::checkUrlMatch($regx,$rule);                        if(false !== $match)  {                            if($route instanceof /Closure) {                                // 執行閉包                                $result = self::invokeRule($route, $match);                                // 如果返回布爾值 則繼續執行                                return is_bool($result) ? $result : exit;                            }else{                                return self::parseRule($rule,$route,$regx);                            }                        }                    }                }            }        }        return false;// 返回這里 有什么用嗎    }    // 今天的這個,偷懶了,不好意思哈, 感覺就是,對輸入參數的一個解析,然后返回些真真假假的東西了。    // 檢測URL和規則路由是否匹配    private static function checkUrlMatch($regx,$rule) {        $m1 = explode('/',$regx); // 解析 位置        $m2 = explode('/',$rule); // 規則        $var = array();                 foreach ($m2 as $key=>$val){ // 解析 規則            if(0 === strpos($val,'[:')){ // 如果                $val    =   substr($val,1,-1);// 截取位置            }            if(':' == substr($val,0,1)) {// 動態變量                if($pos = strpos($val,'|')){ // 如果 就是那個                    // 使用函數過濾                    $val   =   substr($val,1,$pos-1); // 如果 這里 也是一個解析了呢                }                if(strpos($val,'//')) { // 查找位置                    $type = substr($val,-1);                    if('d'==$type) {                        if(isset($m1[$key]) && !is_numeric($m1[$key]))                            return false; // 返回位置                    }                    $name = substr($val, 1, -2); // 返回 截取位置                }elseif($pos = strpos($val,'^')){// 各種 位置                    $array   =  explode('-',substr(strstr($val,'^'),1)); // 這里的東西                    if(in_array($m1[$key],$array)) { //如果是數組了                        return false;                    }                    $name = substr($val, 1, $pos - 1);// 各種截取了                }else{                    $name = substr($val, 1);                }                $var[$name] = isset($m1[$key])?$m1[$key]:'';            }elseif(0 !== strcasecmp($val,$m1[$key])){                return false;            }        }        // 成功匹配后返回URL中的動態變量數組        return $var;    }// 返回 這里的 數據了    // 一頓神匹配,然后轉換成為 url 位置    // 解析規范的路由地址    // 地址格式 [控制器/操作?]參數1=值1&參數2=值2...    private static function parseUrl($url) {        // 倉庫 開始        $var  =  array();        // 處理 開始        if(false !== strpos($url,'?')) { // [控制器/操作?]參數1=值1&參數2=值2...            $info   =  parse_url($url);            $path   = explode('/',$info['path']);            parse_str($info['query'],$var); // parse_str(string,array) 第一個是 string array        }elseif(strpos($url,'/')){ // [控制器/操作]            $path = explode('/',$url);        }else{ // 參數1=值1&參數2=值2...            parse_str($url,$var);        }        // 解析 url ---> path 跟 var  兩個里面開始。        if(isset($path)) { // 如果有的話            $var[C('VAR_ACTION')] = array_pop($path); // var_action            if(!empty($path)) {                $var[C('VAR_CONTROLLER')] = array_pop($path); // var_controller            }            if(!empty($path)) {                $var[C('VAR_MODULE')]  = array_pop($path);// var_module            }        } // 轉換  path 到 var  此處就已經合二唯一。        // 處理 結束        // 倉庫 結束        return $var;    }// 總結: 就是 里面的 url 到 var    // 解析規則路由    // '路由規則'=>'[控制器/操作]?額外參數1=值1&額外參數2=值2...'    // '路由規則'=>array('[控制器/操作]','額外參數1=值1&額外參數2=值2...')    // '路由規則'=>'外部地址'    // '路由規則'=>array('外部地址','重定向代碼')    // 路由規則中 :開頭 表示動態變量    // 外部地址中可以用動態變量 采用 :1 :2 的方式    // 'news/:month/:day/:id'=>array('News/read?cate=1','status=1'),    // 'new/:id'=>array('/new.php?id=:1',301), 重定向    // 這里 看起來  比較惱火 里面的東西    private static function parseRule($rule,$route,$regx) { // 規則rule route  regx 里面的        // 規則 解析        // 獲取路由地址規則        $url   =  is_array($route)?$route[0]:$route; // 這個是奇怪的規則了        // 獲取URL地址中的參數        $paths = explode('/',$regx);// 規則了        // 解析路由規則        $matches  =  array(); // 路由規則        $rule =  explode('/',$rule); // 感覺了 里面的 那個 進行了 切換        foreach ($rule as $item){            $fun    =   '';// 如果 了 fun            if(0 === strpos($item,'[:')){ // 分支 1                $item   =   substr($item,1,-1); // 前后 去掉 一個部分            }            // 處理的結果 就是 $item 了。            if(0===strpos($item,':')) { // 動態變量獲取 分支2                if($pos = strpos($item,'|')){  // 亞分支1                    // 支持函數過濾                    $fun  =  substr($item,$pos+1);                    $item =  substr($item,0,$pos);                                    }                if($pos = strpos($item,'^') ) { // 亞分支2                    $var  =  substr($item,1,$pos-1);                }elseif(strpos($item,'//')){// 亞分支3                    $var  =  substr($item,1,-2);                }else{                    $var  =  substr($item,1); // substr(string,start,length)                }                $matches[$var] = !empty($fun)? $fun(array_shift($paths)) : array_shift($paths);// 去掉了 里面了            }else{ // 過濾URL中的靜態變量                array_shift($paths); // 出來 里面的 那個了            }        }        // foreach 里面的 結束        // 分叉處理 1        if(0=== strpos($url,'/') || 0===strpos($url,'http')) { // 路由重定向跳轉  特殊的 處理            if(strpos($url,':')) { // 傳遞動態參數                $values = array_values($matches);                $url = preg_replace_callback('/:(/d+)/', function($match) use($values){ return $values[$match[1] - 1]; }, $url);            }            header("Location: $url", true,(is_array($route) && isset($route[1]))?$route[1]:301);// 重定義了 里面的那個。是這樣處理了            exit;        }else{ // 分叉處理 2            // 解析路由地址            $var  =  self::parseUrl($url);// 這里 反饋回去了,            // 解析路由地址里面的動態參數            $values  =  array_values($matches); // array_values() 函數返回一個包含給定數組中所有鍵值的數組,但不保留鍵名。            foreach ($var as $key=>$val){ // 過濾處理一下,其實 也沒什么特殊的了, 我發現了                if(0===strpos($val,':')) {                    $var[$key] =  $values[substr($val,1)-1];                }            }            $var   =   array_merge($matches,$var); // 合并的            // 解析剩余的URL參數            if(!empty($paths)) {                // 閉包函數(匿名函數)可以從父作用域中繼承變量   任何此類變量都應該用 use 語言結構傳遞進去                preg_replace_callback('/(/w+)//([^//]+)/', function($match) use(&$var){ $var[strtolower($match[1])]=strip_tags($match[2]);}, implode('/',$paths));            }            // 解析路由自動傳入參數            if(is_array($route) && isset($route[1])) {// 獲取了 參數的 解析了                if(is_array($route[1])){                    $params     =   $route[1]; // 參數解析                }else{                    parse_str($route[1],$params);                }                                $var   =   array_merge($var,$params);            }            $_GET   =  array_merge($var,$_GET); // 最后,高 了半天是 轉換到 GET 里面了。        }        return true;    }    // 解析正則路由    // '路由正則'=>'[控制器/操作]?參數1=值1&參數2=值2...'    // '路由正則'=>array('[控制器/操作]?參數1=值1&參數2=值2...','額外參數1=值1&額外參數2=值2...')    // '路由正則'=>'外部地址'    // '路由正則'=>array('外部地址','重定向代碼')    // 參數值和外部地址中可以用動態變量 采用 :1 :2 的方式    // '/new//(/d+)//(/d+)/'=>array('News/read?id=:1&page=:2&cate=1','status=1'),    // '/new//(/d+)/'=>array('/new.php?id=:1&page=:2&status=1','301'), 重定向    private static function parseRegex($matches,$route,$regx) {        // 獲取路由地址規則        $url   =  is_array($route)?$route[0]:$route; // 獲取 url 里面的東西        $url   =  preg_replace_callback('/:(/d+)/', function($match) use($matches){return $matches[$match[1]];}, $url);         if(0=== strpos($url,'/') || 0===strpos($url,'http')) { // 路由重定向跳轉            header("Location: $url", true,(is_array($route) && isset($route[1]))?$route[1]:301);            exit;        }else{            // 解析路由地址            $var  =  self::parseUrl($url);            // 處理函數            foreach($var as $key=>$val){                if(strpos($val,'|')){                    list($val,$fun) = explode('|',$val);                    $var[$key]    =   $fun($val);                }            }            // 解析剩余的URL參數            $regx =  substr_replace($regx,'',0,strlen($matches[0]));            if($regx) {                preg_replace_callback('/(/w+)//([^//]+)/', function($match) use(&$var){                    $var[strtolower($match[1])] = strip_tags($match[2]);                }, $regx);            }            // 解析路由自動傳入參數            if(is_array($route) && isset($route[1])) {                if(is_array($route[1])){                    $params     =   $route[1];                }else{                    parse_str($route[1],$params);                }                $var   =   array_merge($var,$params);            }            $_GET   =  array_merge($var,$_GET);        }        return true; // 沒有返回值 里面的話,就只有一個東西了,    }// 就是換成正則解析了唄    // 執行正則匹配下的閉包方法 支持參數調用    static private function invokeRegx($closure, $var = array()) {        $reflect = new /ReflectionFunction($closure); // 這個貌似是個高大尚的函數內        $params  = $reflect->getParameters();        $args    = array();        array_shift($var);        foreach ($params as $param){            if(!empty($var)) {                $args[] = array_shift($var);            }elseif($param->isDefaultValueAvailable()){                $args[] = $param->getDefaultValue();            }        }        return $reflect->invokeArgs($args);    }// 以后有機會重點研究一下,哈哈    // 執行規則匹配下的閉包方法 支持參數調用    static private function invokeRule($closure, $var = array()) {        $reflect = new /ReflectionFunction($closure);        $params  = $reflect->getParameters();        $args    = array();        foreach ($params as $param){            $name = $param->getName();            if(isset($var[$name])) {                $args[] = $var[$name];            }elseif($param->isDefaultValueAvailable()){                $args[] = $param->getDefaultValue();            }        }        return $reflect->invokeArgs($args);    } // 同上}// 總結: 今天突然很有感悟,就是 以前看的云里霧里的函數,突然反向,可以 就是 幾個邏輯關系而已,很清楚。哈// 不愧 規則大轉換啊,哈哈
    PHP編程

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
    亚洲欧美精品伊人久久| 91精品国产高清自在线| 美女久久久久久久久久久| 精品视频—区二区三区免费| 欧美又大粗又爽又黄大片视频| 欧美日韩国产精品一区二区不卡中文| 欧美中文字幕视频| 揄拍成人国产精品视频| 欧美一级淫片播放口| 亚洲mm色国产网站| 日韩一区视频在线| www.久久色.com| 亚洲人高潮女人毛茸茸| 亚洲第一视频网站| 国产精品老女人精品视频| 日韩中文字幕视频在线| 中日韩美女免费视频网站在线观看| 中文字幕不卡在线视频极品| www.久久撸.com| 成人国产精品日本在线| 久久精品99久久久久久久久| 欧美亚洲另类在线| 国产精品成人一区二区| 国产精品热视频| 国产精品99久久久久久久久| 色婷婷av一区二区三区在线观看| 亚洲免费一级电影| 久久亚洲精品网站| 自拍偷拍亚洲一区| 亚洲天堂av综合网| 国产精品成人一区二区三区吃奶| 日韩精品中文字幕有码专区| 疯狂做受xxxx欧美肥白少妇| 国内免费精品永久在线视频| 欧美日韩另类视频| 欧美日韩成人在线观看| 亚洲在线视频观看| 日韩网站免费观看高清| 亚洲热线99精品视频| 久久99久久亚洲国产| 国产精品久久电影观看| 国产精品高潮呻吟久久av黑人| 国内精品美女av在线播放| 隔壁老王国产在线精品| 欧美日韩在线视频首页| 亚洲精品电影在线观看| 国产精品在线看| 国产成人亚洲综合91| 日韩av免费在线看| 久久久免费在线观看| 91欧美精品午夜性色福利在线| 亚洲视频电影图片偷拍一区| 亚洲欧美日韩精品久久亚洲区| 亚洲图片欧洲图片av| 一区三区二区视频| 91国产美女视频| 狠狠躁夜夜躁人人躁婷婷91| 欧美疯狂xxxx大交乱88av| 97成人精品视频在线观看| 最新国产精品亚洲| 欧美精品做受xxx性少妇| 亚洲精品在线视频| 日韩乱码在线视频| 最新69国产成人精品视频免费| 91精品国产91久久久久久最新| 日韩av在线免费观看一区| 国产精品久久久久久一区二区| 亚洲欧美日本精品| 国产日韩欧美日韩大片| 欧美在线视频网站| 91夜夜揉人人捏人人添红杏| 欧美成人免费网| 亚洲最新av在线| 欧美黑人性猛交| 欧美在线播放视频| 国产精品自拍网| www.日韩不卡电影av| 2020久久国产精品| 久久高清视频免费| 精品国产乱码久久久久久天美| 欧美疯狂性受xxxxx另类| 97香蕉超级碰碰久久免费软件| 亚洲欧美综合图区| 国产成人拍精品视频午夜网站| 亚洲一区二区免费| 欧美在线视频a| 成人激情春色网| 精品日韩美女的视频高清| 久久久久久久久久久成人| 国产精品免费一区二区三区都可以| 亚洲毛片在线看| 性欧美暴力猛交69hd| 精品久久久久久中文字幕一区奶水| 精品国产依人香蕉在线精品| 成人免费直播live| 成人av资源在线播放| 日韩一区二区三区国产| 国产日韩亚洲欧美| 日韩av在线播放资源| 在线日韩第一页| 亚洲aⅴ男人的天堂在线观看| 日韩在线视频中文字幕| 亚洲精品99久久久久| 欧美日本中文字幕| 国产精品一区=区| 亚洲成人久久网| 91网站在线免费观看| 一区二区欧美久久| 欧美在线视频免费播放| 最近2019年好看中文字幕视频| 精品久久久久久国产91| 九九精品在线视频| 91极品女神在线| 另类图片亚洲另类| 一区二区欧美亚洲| 亚洲第一综合天堂另类专| 68精品国产免费久久久久久婷婷| 国产欧美va欧美va香蕉在| 庆余年2免费日韩剧观看大牛| 狠狠做深爱婷婷久久综合一区| 日韩av三级在线观看| 4444欧美成人kkkk| 欧美性猛交xxxx乱大交3| 国产精品日韩欧美大师| 亚洲成年网站在线观看| 国产精品7m视频| 亚洲国产古装精品网站| 欧美国产日本高清在线| 国产视频精品va久久久久久| 欧美日韩国产在线看| 成人h片在线播放免费网站| 2019最新中文字幕| 久久影院模特热| 97香蕉超级碰碰久久免费软件| 久久亚洲精品一区二区| 国模视频一区二区| 欧美日韩免费观看中文| 亚洲欧美综合另类中字| 欧美极品欧美精品欧美视频| 欧美一级电影免费在线观看| 日本午夜在线亚洲.国产| 国产一区二区三区高清在线观看| 91国产视频在线播放| 川上优av一区二区线观看| 日韩国产精品亚洲а∨天堂免| 亚洲无av在线中文字幕| 久久躁日日躁aaaaxxxx| 最近2019好看的中文字幕免费| 国产欧美最新羞羞视频在线观看| 福利视频导航一区| 色偷偷综合社区| 亚洲欧美国产日韩中文字幕| 亚洲91精品在线观看| 亚洲人成电影在线播放| 欧美午夜视频一区二区| 成人免费观看a| 欧美电影免费观看高清完整| 国产69精品久久久久9999| 国产玖玖精品视频| 国产精品久久久久999| 97精品一区二区三区| 一本色道久久综合狠狠躁篇的优点| 亚洲日本中文字幕免费在线不卡| 国产亚洲精品91在线|