博客列表 >PHP实战案例:路由解析

PHP实战案例:路由解析

李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰
李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰原创
2020年05月18日 08:05:201118浏览

案例代码:

1、url地址:两种形式

第一种:http://php.edu/route/demo.php/a/b?p=1&m=3
第二种:http://php.edu/route/demo.php/a/b/p/1/m/3

第一种解析代码1

  1. <?php
  2. echo $_SERVER['PATH_INFO'],'<br>';
  3. echo $_SERVER['PHP_SELF'],'<br>';
  4. echo $_SERVER['SERVER_ADDR'],'<br>';
  5. echo $_SERVER['SERVER_NAME'],'<br>';
  6. echo $_SERVER['REQUEST_METHOD'],'<br>';
  7. echo $_SERVER['QUERY_STRING'],'<br>';
  8. echo '<a href="demo2.php">显示前一个页面的url;$_SERVER[\'HTTP_REFERER\']</a>','<br>';
  9. echo $_SERVER['SCRIPT_FILENAME'],'<br>';
  10. echo $_SERVER['SCRIPT_NAME'],'<br>';
  11. echo $_SERVER['SERVER_PORT'],'<br>';
  12. echo $_SERVER['REQUEST_URI'],'<br>';
  13. echo '<hr>';
  14. echo print_r($_GET,true),'<br>';
  15. echo implode(',', $_GET),'<br>';
  16. vprintf('?p=%s&m=%s', $_GET);
  17. echo '<br>';
  18. // url类型
  19. echo 'url类型:','<br>';
  20. echo "第一种url:http://php.edu/route/demo.php/a/b?p=1&m=3",'<br>';
  21. echo "第二种url:http://php.edu/route/demo.php/a/b/p/1/m/3",'<br>';
  22. echo '<hr>';
  23. echo '<h3>第一种url解析</h3>';
  24. // 第一种路由解析
  25. $cm=explode('/',$_SERVER['PATH_INFO']);
  26. $cm=array_values(array_filter($cm));
  27. // 解析出类和方法
  28. $method=array_pop($cm);//尾部出
  29. $class=ucfirst(array_shift($cm));//头部出
  30. $params=$_SERVER['QUERY_STRING'];
  31. // print_r($params);
  32. parse_str($params,$agu);
  33. // print_r(array_values($agu));
  34. // $url=parse_url('http://php.edu/route/demo.php/a/b?p=1&m=3');
  35. // 调用类
  36. class A
  37. {
  38. public function b($n,$m)
  39. {
  40. return sprintf('当前类:%s<br>当前方法:%s<br>当前参数:%s,%s',__CLASS__,__METHOD__,$n,$m);
  41. }
  42. }
  43. $c=new $class();
  44. echo $c->$method(...array_values($agu));

第二种解析代码2

  1. <?php
  2. echo @$_SERVER['HTTP_REFERER'];
  3. // url类型
  4. echo 'url类型:','<br>';
  5. echo "第一种url:http://php.edu/route/demo.php/a/b?p=1&m=3",'<br>';
  6. echo "第二种url:http://php.edu/route/demo.php/a/b/p/1/m/3",'<br>';
  7. echo '<hr>';
  8. echo '<h3>第一种url解析</h3>';
  9. // 第二种路由解析
  10. // print_r($_SERVER['PATH_INFO']);
  11. $cm=explode('/',$_SERVER['PATH_INFO']);
  12. $cm=array_values(array_filter($cm));
  13. // print_r($cm);
  14. // 解析出类和方法
  15. $class=ucfirst(array_shift($cm));//头部出
  16. $method=array_shift($cm);//头部出
  17. //解析参数
  18. $params=[];
  19. for($i=0;$i<count($cm);$i+=2){
  20. if(isset($cm[$i+1])){
  21. $params[$cm[$i]]=$cm[$i+1];
  22. }
  23. }
  24. // print_r($params);
  25. // 调用类
  26. class A
  27. {
  28. public function b($n,$m)
  29. {
  30. return sprintf('当前类:%s<br>当前方法:%s<br>当前参数:%s,%s',__CLASS__,__METHOD__,$n,$m);
  31. }
  32. }
  33. $c=new $class();
  34. echo $c->$method(...array_values($params));

演示结果:

总结

1、路由原理::将URL中的控制器,方法和参数解析出来,映射到对应的控制器类和方法上
2、路由常用函数:$_GET获取参数返回参数数组;$_SERVER['QUERY_STRING']获取参数组成的字符串,url地址中?后面的部分;
$SERVER['PATH_INFO']获取路径变量,跟在文件后面的变量例如php.edu/route/demo1.php/a/b 中的 /a/b;
array_filter()过滤数组中的空值,array_values()把二维数组的值取出重排;array_shift()从数组头部取出一个;
parse_str($str,$array)把一个查询字符串解析成数组返回;explode('分割字符','字符串')按分隔符把字符串解析成一个变量;
ucfirst($str)把字符串首字母大写;

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议