博主信息
博文 37
粉丝 1
评论 0
访问量 33026
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
解刨mvc中pathinfo路由解析原理
卢先生
原创
732人浏览过

解刨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转换成数组
批改老师:PHPzPHPz

批改状态:合格

老师批语:
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学