真假rewrite以後的怪事,找不到變量在哪裏定義

繼上篇真假rewrite以後的怪事
rewrite問題解決以後,我又遇到了哪些問題?php

$_GET獲得的數據,居然沒有一個地方使用,也沒有定義變量。數組

個人大腦真的有點抽,怎麼回事情?找不到變量定義!?函數

具體是怎麼回事呢?
我在class下的index.php中獲得思路。url

那就是數組變換成變量

這個方法是第一次見到,還真真的第一次見到code

方法以下開發

$_GET && extract($_GET);string

我苦苦思索,須要的變量究竟是哪裏來的,使用sublime txt 在路徑中查找就是沒有找到,結果逐步跟蹤的時候,發現這個東西it

extract() 方法在手冊中是這樣說的io

extract — 從數組中將變量導入到當前的符號表function

說明

intextract ( array&$var_array [, int$extract_type = EXTR_OVERWRITE [, string$prefix = NULL ]] )

本函數用來將變量從數組中導入到當前的符號表中。

檢查每一個鍵名看是否能夠做爲一個合法的變量名,同時也檢查和符號表中已有的變量名的衝突。

雖然php提供瞭如此優秀的方法,做爲一個PHP的初學者,真心不肯意你使用這種方法,尤爲是在不斷的include的狀況下,

看一下文件路徑你就會知道了

root-class

   ----index.php   文件a

   -lib

   ----index.php  文件b

   -index.php  文件c

   -rewrite.php  文件d

整個系統文件執行過程是Apache僞靜態重寫至文件d

文件d對重寫後的url進行解析(主要是一個preg_match方法進行正則對比)我再放一遍 主要方法,上篇文章的代碼太多,不少人確定看不下去了。

function __rewrite(){

global $r_rewrite,$r_uri,$r_d,$r_dir,$r_content_type_list;

$matching=false;

foreach($r_rewrite as $v){

if(preg_match($v[0],$r_uri,$matches)){

$r_uri=$v[1];

$r_uri=preg_replace('/\$(\d+)/e','$matches[$1]',$r_uri);

$matching=true;

break;

}

if($matching){

$url_info=parse_url($r_uri);

$r_include=str_replace('/',$r_d,$r_dir.$url_info['path']);

if(file_exists($r_include) && filetype($r_include)=='file'){

if($query=$url_info['query']){

$sp=explode('&',$query);

foreach($sp as $v){

$sp2=explode('=',$v);

$_GET[$sp2[0]]=addslashes(urldecode($sp2[1]));//重要

}

$_SERVER['QUERY_STRING']=$query;

}

//if($url_info[''])

return $r_include;

} else return __rewrite();

} else return false;

}

解析後 若是正確解析則引入文件c 在 文件c 中引入 文件a 在文件a中引入文件b

文件a中使用extract 方法對$_GET 進行變量轉換,在文件b中使用$_GET轉換後的變量

流程就是上面的樣子了, 這是多麼讓人悲哀的事情,多重的include,在沒有手冊指導註釋引導的狀況下,對系統的二次開發和後期維護形成很大難度。

故而本文不建議新手php使用這個方法。

相關文章
相關標籤/搜索