使用過tp5和tp3版本朋友,會發現tp5完全是thinkphp的一次重構。給我們的不是版本的更新,完全就是兩個不同的架構嘛。如果用習慣了tp3,斷崖式跳到了tp5,難免會不适應。
其中就有一個對$_GET這個全局變量的使用問題,在有些情況下,tp5無法使用$_GET擷取資料?
如果你的請求的位址參數是以pathinfo形式,這樣參數是無法用$_GET去擷取的,同樣也不能使用系統中的get方法。
//請求位址"http://www.xxx.com/index/user/uid/100"
print_r($_GET['uid']);//擷取不uid,會丢出一個異常
print_r(input('get.uid'))//結果為空
print_r(input('id'))//ok,正常擷取
print_r(input('param.id'))//ok,正常擷取
print_r(Request::instance()->param('id'))//ok,正常擷取
print_r(Request::instance()->get('id'))//結果為空
//請求位址為"http://www.xxx.com/index/user?uid=100"
print_r($_GET['uid']);//ok,正常擷取
print_r(input('get.uid'))//ok,正常擷取
print_r(input('id'))//ok,正常擷取
print_r(input('param.id'))//ok,正常擷取
print_r(Request::instance()->param('id'))//ok,正常擷取
print_r(Request::instance()->get('id'))//ok,正常擷取
//請求位址為"http://www.xxx.com/index/user/uid/100?name=chenxing"
print_r($_GET);//隻能擷取name值
print_r(input('get.'))//隻能擷取name值
print_r(input(''))//ok,正常擷取是以值
print_r(input('param.'))//ok,正常擷取是以值
print_r(Request::instance()->param(''))//ok,正常擷取是以值
print_r(Request::instance()->get(''))//隻能擷取name值
上面的三種請求參數位址在我們日常開發中比較常見,那麼能夠正常擷取的請用系統的param方式擷取,這個是最相容的擷取方式
回到問題,我們探究為什麼pathinfo中的參數$_GET無法正常擷取?能産生這樣疑問的朋友其實陷入tp3給我們帶來的認知誤區。在tp3中上面的請求的三種方式都可以用$_GET擷取其中的所有參數,久而久之你就習慣了這種寫法,然後就把這種擷取方式變成理所當然。我們撇開架構pathinfo位址同樣無法用$_GET擷取,對于位址中的get請求的參數必須是以”?“開始的。那麼為什麼tp3可以呢?因為tp3把pathinfo中的參數整合到了get請求中。
現在大家應該能夠明白的感受到開頭提到的tp3到tp5這種斷崖式更新了吧。忘掉tp3,讓tp5在我們手中快活的遊走