Blogger Information
Blog 32
fans 2
comment 0
visits 28107
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
实现一个简单的URL到控制器方法的映射
简行
Original
1334 people have browsed it

一.实现一个简单的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);

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:一个真实的路由比这个复杂得多,但思路是一样的
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