```
class Dispatcher {
static $_instance;
/**
* 请求模块
*/
private $_model = '';
/**
* 请求模块方法
*/
private $_method = '';
/**
* 请求参数
*/
private $_params;
/**
* 路由表
*/
private $_routingTable;
/**
* 访问路径
*/
private $_path = NULL;
public static function getInstance() {
if(self::$_instance == null) {
self::$_instance = new Dispatcher();
return self::$_instance;
} else {
return self::$_instance;
}
}
private function __construct() {
$this->_path = $this->setPath();
$this->_routingTable = Option::getRoutingTable();
$urlMode = Option::get('isurlrewrite');
foreach ($this->_routingTable as $route) {
if (!isset($route['reg_' . $urlMode])) {
$reg = isset($route['reg']) ? $route['reg'] : $route['reg_0'];
} else {
$reg = $route['reg_' . $urlMode];
}
if (preg_match($reg, $this->_path, $matches)) {
$this->_model = $route['model'];
$this->_method = $route['method'];
$this->_params = $matches;
break;
} elseif (preg_match($route['reg_0'], $this->_path, $matches)) {
$this->_model = $route['model'];
$this->_method = $route['method'];
$this->_params = $matches;
break;
}
}
if (empty($this->_model)) {
show_404_page();
}
}
public function dispatch(){
$module = new $this->_model();
$method = $this->_method;
$module->$method($this->_params);
}
public static function setPath(){
$path = '';
if (isset($_SERVER['HTTP_X_REWRITE_URL'])) { //iis
$path = $_SERVER['HTTP_X_REWRITE_URL'];
} elseif (isset($_SERVER['REQUEST_URI'])) {
$path = $_SERVER['REQUEST_URI'];
} else {
if (isset($_SERVER['argv'])) {
$path = $_SERVER['PHP_SELF'] .'?'. $_SERVER['argv'][0];
} else {
$path = $_SERVER['PHP_SELF'] .'?'. $_SERVER['QUERY_STRING'];
}
}
//for iis6 path is GBK
if (isset($_SERVER['SERVER_SOFTWARE']) && false !== stristr($_SERVER['SERVER_SOFTWARE'], 'IIS')) {
if (function_exists('mb_convert_encoding')) {
$path = mb_convert_encoding($path, 'UTF-8', 'GBK');
} else {
$path = @iconv('GBK', 'UTF-8', @iconv('UTF-8', 'GBK', $path)) == $path ? $path : @iconv('GBK', 'UTF-8', $path);
}
}
//for ie6 header location
$r = explode('#', $path, 2);
$path = $r[0];
//for iis6
$path = str_ireplace('index.php', '', $path);
//for subdirectory
$t = parse_url(BLOG_URL);
$path = str_replace($t['path'], '/', $path);
return $path;
}
}
```