博客列表 >实现一个简单的URL到控制器方法的映射

实现一个简单的URL到控制器方法的映射

简行
简行原创
2020年08月11日 17:13:221312浏览

一.实现一个简单的URL到控制器方法的映射

1.index.php:一些URL参数的获取及操作

  1. <?php
  2. // http://myphp.edu/0805/index.php/demo/getinfo?p=5&name=admin&leve=青铜
  3. echo $_SERVER['PATH_INFO'], '<br>';
  4. echo $_SERVER['REQUEST_URI'], '<br>';
  5. //URL地址有些字符会转义成特殊符号
  6. echo $_SERVER['QUERY_STRING'], '<br>';
  7. echo "<hr>";
  8. echo "将URL地址进行编码:".urlencode($_SERVER['QUERY_STRING']), '<br>';
  9. echo "将URL地址进行解码:".urldecode($_SERVER['QUERY_STRING']), '<br>';
  10. echo "<hr>";
  11. // parse_url(): 解析URL的各个部分,并返回一个数组
  12. print_r(parse_url(urldecode($_SERVER['REQUEST_URI'])));
  13. echo "<hr>";
  14. // pathinfo(): 返回当前脚本的路径信息,以数组方式
  15. print_r(pathinfo(urldecode($_SERVER['REQUEST_URI'])));
  16. echo "<hr>";
  17. //parse_str(): $_SERVER['QUERY_STRING'],将查询字符串以数组的方式返回
  18. parse_str($_SERVER['QUERY_STRING'],$arr);
  19. print_r($arr);
  20. echo "<hr>";
  21. // http_build_query():使用给出的关联(或下标)数组生成一个经过 URL-encode 的请求字符串
  22. echo http_build_query(['name'=>'admin', 'leve'=>'30', 'p'=>6]);


2.index1.php:简单演示

  1. <?php
  2. http://myphp.edu/0805/index1.php/demo/getinfo/p/5/name/admin/leve/青铜
  3. namespace MVCtest;
  4. class DemoController
  5. {
  6. public function getinfo($p,$name,$leve){
  7. return "用户:".$name.",等级:".$leve."当前处于第".$p."页";
  8. }
  9. }
  10. $pathinfo = $_SERVER['PATH_INFO'];
  11. $pathinfo = array_values(array_filter(explode("/",$pathinfo)));
  12. var_dump($pathinfo);
  13. echo "<hr>";
  14. // array_filter():过滤掉空元素,返回数组
  15. // $con = array_filter(explode("/",$pathinfo));
  16. // array_values():将数据键名重置,从0开始,返回数组
  17. // $con=array_values($con);
  18. // array_shift():函数删除(取出)数组中第一个元素,并返回被删除(取出)元素的值
  19. // array_pop():删除(取出)数组中的最后一个元素
  20. // ucfirst():把字符串中的首字符转换为大写。
  21. //综合写法:获取控制器(类名)
  22. $controller = __NAMESPACE__."\\".ucfirst(array_shift($pathinfo))."Controller";
  23. echo $controller,"<hr>";
  24. //方法
  25. $action = array_shift($pathinfo);
  26. echo $action,"<hr>";
  27. //参数
  28. var_dump($pathinfo);
  29. echo"<hr>";
  30. $data = [];
  31. for($i=0;$i <count($pathinfo);$i+=2){
  32. if(isset($pathinfo[$i+1]))
  33. {
  34. $data[$pathinfo[$i]]=$pathinfo[$i+1];
  35. }
  36. }
  37. var_dump($data);
  38. echo"<hr>";
  39. //客户端调用
  40. // 1.直观调用
  41. echo (new $controller())->$action($data['p'],$data['name'],$data['leve']),"<br>";
  42. // 2.常用调用
  43. // call_user_func_array(callable $callback , array $param_arr) : 调用回调函数,并把一个数组参数作为回调函数的参数,把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入。
  44. // call_user_func(参数一):作用与call_user_func_array一样
  45. echo call_user_func_array([(new $controller),$action],$data);

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