在thinkphp的框架中,请求分发部分需要解析m c a参数,解析后就从$_GET数组中删除了对应的参数
path\to\ThinkPHP\Library\Think\Think.class.php
/**
* 应用程序初始化
* @access public
* @return void
*/
static public function start() {
...
// 运行应用
App::run();
}
path\to\ThinkPHP\Library\Think\App.class.php
/**
* 运行应用实例 入口文件使用的快捷方法
* @access public
* @return void
*/
static public function run() {
...
App::init();
...
}
/**
* 应用程序初始化
* @access public
* @return void
*/
static public function init() {
...
// URL调度
Dispatcher::dispatch();
...
path\to\ThinkPHP\Library\Think\Dispatcher.class.php
/**
* URL映射到控制器
* @access public
* @return void
*/
static public function dispatch() {
...
// 获取模块名称
define('MODULE_NAME', defined('BIND_MODULE')? BIND_MODULE : self::getModule($varModule));
...
// 获取控制器的命名空间(路径)
define('CONTROLLER_PATH', self::getSpace($varAddon,$urlCase));
// 获取控制器和操作名
define('CONTROLLER_NAME', defined('BIND_CONTROLLER')? BIND_CONTROLLER : self::getController($varController,$urlCase));
define('ACTION_NAME', defined('BIND_ACTION')? BIND_ACTION : self::getAction($varAction,$urlCase));
...
/**
* 获得实际的控制器名称
*/
static private function getController($var,$urlCase) {
...
$controller = (!empty($_GET[$var])? $_GET[$var]:C('DEFAULT_CONTROLLER'));
unset($_GET[$var]);
...
}
获取模块和操作方法的代码类似.
其实本来也不应该直接从$_GET中取数据,因为如果使用pathinfo的URL模式或者rewrite的URL模式的时候这些参数都不在$_GET中