Blogger Information
Blog 145
fans 7
comment 7
visits 164551
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP实战案例:路由解析
李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰
Original
1117 people have browsed it

案例代码:

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)把字符串首字母大写;

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:路由是任何框架都具体的基本功能, http请求通过路由发送
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post