ASCII码 ASCII码

解刨mvc中pathinfo路由解析原理

发布于:2022-02-27 09:53:19  栏目:技术文档

解刨mvc中pathinfo路由解析原理利用超全局函数拿到数组拿到的值,对值进行操作,操作后映射到方法中,解析http ://*.com/demo1.php/user/index/id/1/name/user代码部分:

  1. <?php
  2. namespace mvc;
  3. class User
  4. {
  5. function index($id, $name)
  6. {
  7. return "您好{$name},您的id是$id";
  8. }
  9. }
  10. // echo (new User)->index(1, 'pt');
  11. // var_dump($_SERVER['PATH_INFO']);
  12. // array_filter去除空字符 array_values将数组重新排序
  13. $res = array_values(array_filter(explode("/", $_SERVER['PATH_INFO'])));
  14. // var_dump($res);
  15. $controller = __NAMESPACE__ . '\\' . array_shift($res);
  16. //下面是方法名
  17. var_dump($controller);
  18. $method = array_shift($res);
  19. // 下面是控制器名
  20. var_dump($method);
  21. var_dump($res);
  22. // $params = ['id' => 1, 'name' => 'peter'];
  23. // i等于0的时候 i自增0+2赋值给i i等于2,
  24. for ($i = 0; $i < count($res); $i += 2) {
  25. // array(4) {
  26. // [0]=>
  27. // string(2) "id"
  28. // [1]=>
  29. // string(1) "1"
  30. // [2]=>
  31. // string(4) "name"
  32. // [3]=>
  33. // string(4) "user"
  34. // }
  35. // 解释下下面,丫的 刚刚差点没理解 for是从0开始进入的 妈的 这一个点让我头疼了半天
  36. // 第一次进来是$params[$res[$i]]是0 $res[$i + 1];为1,因为是从0开始的
  37. // 第二次进来 i就是2了 $params[$res[$i]]就是2了 , $res[$i + 1];就是3
  38. $params[$res[$i]] = $res[$i + 1];
  39. }
  40. // for上面实现的,下面是foreach实现的
  41. var_dump($params); //这里的params跟下面的ress都是一个数组,随便用...
  42. foreach ($res as $key => $value) {
  43. $ress['id'] = $res['1'];
  44. $ress['name'] = $res['3'];
  45. }
  46. var_dump($ress);
  47. // 第一种解决方法
  48. // $au = (new User)->index($ress['id'], $ress['name']);
  49. // var_dump($au);
  50. // 第二种回调的解决方法
  51. $ca = call_user_func_array([(new $controller), $method], [$ress['id'], $ress['name']]);
  52. // call_user_func_array 回调函数第一个值可以是一个数组,数组内第一个值是类名,第二个值是是类内的方法,第二个值是给第一个值注入的参数
  53. // 在没有类的情况下,第一个值就是一个方法,并且支持引用传递
  54. echo $ca;
  55. //上面是将api地址解析成数组
  56. //示例网址http://1.com/demo1.php/user/index/id/1/name/user

第二种,get方式传参,路由地址为/url/index?id=6&name=peter格式的

代码部分:

  1. <?php
  2. namespace mvc;
  3. class url
  4. {
  5. public function index($name, $id)
  6. {
  7. return "当前用户为" . $name . '.' . '当前用户的id为' . $id;
  8. }
  9. }
  10. var_dump($_SERVER['REQUEST_URI']);
  11. $url = $_SERVER['REQUEST_URI'];//获取到路由的地址
  12. $urlarr = parse_url($url);//将路由地址转数组
  13. var_dump($urlarr['query']);
  14. parse_str($urlarr['query'], $xarr);//将需要的get部分的路由地址转数组
  15. var_dump($xarr);
  16. echo (new url)->index($xarr['name'], $xarr['id']);//传值
  17. // 上面是将1.com/demo2.php/url/index?id=6&name=peter 中的id=6&name=peter转换成数组
相关推荐
阅读 +