Router.class.php代码:

  1. <?php
  2. /*
  3. +----------------------------------------------------------------------
  4. + Title : Router - 路由器基类
  5. + Author : 小黄牛
  6. + Version : V1.0.0.1
  7. + Initial-Time : 2016-10-17 11:12
  8. + Last-time : 2016-10-17 11:12 + 小黄牛
  9. + Desc : 这个类包含了路由重定向
  10. +----------------------------------------------------------------------
  11. */
  12. class Router{
  13. //路由器需要以下的四个成员来初始化Index首页
  14. static protected $controller = 'index'; //默认控制器
  15. static protected $method = 'index'; //默认方法
  16. static protected $url_split = '/'; //路由分隔符
  17. static protected $url_suffix = '.html'; //URL后缀名
  18. // 获得真实的Path_Info参数
  19. protected static function Path_Info(){
  20. if (isset($_SERVER['PATH_INFO'])) {
  21. return $_SERVER['PATH_INFO'];
  22. }
  23. if (isset($_SERVER['REDIRECT_PATH_INFO'])) {
  24. return $_SERVER['REDIRECT_PATH_INFO'];
  25. }
  26. if (isset($_SERVER['REDIRECT_URL'])) {
  27. return $_SERVER['REDIRECT_URL'];
  28. }
  29. return false;
  30. }
  31. }

Route.class.php代码:

  1. <?php
  2. /*
  3. +----------------------------------------------------------------------
  4. + Title : Route - 路由器子类 - 继承与控制器基类
  5. + Author : 小黄牛
  6. + Version : V1.0.0.1
  7. + Initial-Time : 2016-10-17 11:37
  8. + Last-time : 2016-10-17 11:37 + 小黄牛
  9. + Desc :
  10. +----------------------------------------------------------------------
  11. */
  12. class Route extends Router{
  13. /**
  14. * @Title : 全类型路由
  15. * @Author : 小黄牛
  16. * @param string : $RouAlias 路由别名,用于快速生成URL
  17. * @param string : $RouParameter 路由参数变量名,用于识别对应的URL参数 或闭包路由
  18. * @param string : $CA_Function 控制器方法
  19. * @return : 返回一个实例
  20. */
  21. public static function Any($RouAlias,$RouParameter='',$CA_Function='') {
  22. # 获得路由地址
  23. $PATH_INFO = self::Path_Info();
  24. # 判断是否为对应的路由 - 这是错误的路由
  25. $URL = explode('/'.$RouAlias,$PATH_INFO);
  26. if(empty($URL[0]) == false){return false;}
  27. /*****************************闭包路由*****************************/
  28. # 获得闭包对象 - 或URL参数
  29. $Parameter = $RouParameter;
  30. # 判断路由参数是否为对象(闭包路由)
  31. if(is_object($Parameter)){
  32. # 是则调用对象,并返回
  33. $Parameter();
  34. return true;
  35. }
  36. /*****************************不是闭包路由*****************************/
  37. # 删除开头路由
  38. $path = ltrim($PATH_INFO, '/'.$RouAlias);
  39. # 将URL分割成数组
  40. $paths = explode(self::$url_split,$path);
  41. # 将URL变量名分割成数组
  42. $urls = explode(self::$url_split,$RouParameter);
  43. # 重新赋值
  44. foreach ($urls as $key=>$val){
  45. $_GET[$val] = $paths[$key];
  46. }
  47. # 将对应的控制器跟操作方法分割成数组
  48. $AC = explode(self::$url_split,$CA_Function);
  49. # 自动加载控制器
  50. $instance = new $AC[0]();
  51. # 访问对应的操作方法
  52. $instance->$AC[1]();
  53. }
  54. }

Ceshi.php代码:

  1. <?php
  2. /*
  3. +----------------------------------------------------------------------
  4. + Title : 这是给路由器测试调用的控制器文件
  5. + Author : 小黄牛
  6. + Version : V1.0.0.1
  7. + Initial-Time : 2016-10-17 11:27
  8. + Last-time : 2016-10-17 11:27 + 小黄牛
  9. + Desc : 无
  10. +----------------------------------------------------------------------
  11. */
  12. //测试控制器-Index
  13. class Index{
  14. public function Index(){
  15. echo '这是IndexController控制器下的Index方法<br/>由于Index-Index等于构造方法,所以会加载出两次<br/>';
  16. }
  17. public function Add(){
  18. echo '这是IndexController控制器下的Add方法<br/>';
  19. }
  20. }
  21. //测试控制器-Ceshi
  22. class Ceshi{
  23. public function Index(){
  24. echo '这是CeshiController控制器下的Index方法<br/>';
  25. }
  26. public function Add(){
  27. echo '这是CeshiController控制器下的Add方法<br/>';
  28. }
  29. }
  30. //测试控制器-Test
  31. class Test{
  32. public function Index(){
  33. echo $_GET['id'];
  34. echo '这是TestController控制器下的Index方法<br/>';
  35. }
  36. public function Add(){
  37. echo '这是TestController控制器下的Add方法<br/>';
  38. }
  39. }

index.php代码:

  1. <?php
  2. /*
  3. +----------------------------------------------------------------------
  4. + Title : 路由器 单一入口
  5. + Author : 小黄牛
  6. + Version : V1.0.0.1
  7. + Initial-Time : 2016-10-17 11:24
  8. + Last-time : 2016-10-17 11:24 + 小黄牛
  9. + Desc : 从这里实现路由监听
  10. +----------------------------------------------------------------------
  11. */
  12. # 声明页面编码
  13. header("Content-type: text/html; charset=utf-8");
  14. # 引入路由器
  15. require 'Router.class.php';
  16. # 引入路由子类
  17. require 'Route.class.php';
  18. # 引入对应的测试路由类
  19. require 'Ceshi.php';
  20. # 加载路由监听
  21. # 闭包路由
  22. Route::Any('b/',function(){
  23. echo '这下牛逼了';
  24. });
  25. # 默认路由
  26. Route::Any('asd/',function(){
  27. echo '11111111';
  28. });
  29. # 不是闭包路由
  30. Route::Any('i/z','id/name','ceshi/Add');
  31. Route::Any('i/x','id/name','test/index');
  32. Route::Any('i/c','id/name','index/index');

访问的URL

  1. index.php/asd/
  2. index.php/b/
  3. index.php/i/z/1/2
  4. index.php/i/x/3/4
  5. index.php/i/c/5/6