批改状态:合格
老师批语:对url的解析 有许多方法的 , 其实js也可以做到的

<?php// 路由原理// 只要是采用MVC架构的项目,它的URL最终都会映射到一个类中的方法上(函数)// http://php.edu/0805/demo1.php?controler=user&action=showclass UserController{public function show(){return 'Hello Wrold';}}// 此时通过GET参数解析出来了控制器和方法// user 转换 UserController ,用ucfirst$controller = ucfirst($_GET['controller']) . 'Controller';$action = $_GET['action'];// echo (new $controller())->show();// 搜索引擎看到上面的具有GET参数的URL动态地址,并不喜欢,它喜欢静态地址http://php.edu/0805/demo1.php?controler=user&action=show// 将上面的地址改成: PATH_INFO格式// http://php.edu/0805/demo1.php/user/show// /user/show: 像服务器上的路径, path-info// URL地址字符串不支持空格,所以会自动转义它// 拿路径echo $_SERVER['PATH_INFO'], '<br>';// 拿到完整url:http://php.edu/0805/demo1.php/user/showecho $_SERVER['REQUEST_URI'], '<br>';// 拿get参数echo $_SERVER['QUERY_STRING'], '<br>';//将URL地址进行编码echo urlencode('p=6&name=peter zhu'), '<br>';echo urldecode('p%3D6%26name%3Dpeter+zhu');echo '<hr>';// parse_url(): 解决URL的各个部分,返回一个数组print_r(parse_url($_SERVER['REQUEST_URI']));echo '<hr>';// pathinfo(): 返回当前脚本的路径信息,返回一个数组print_r(pathinfo($_SERVER['REQUEST_URI']));echo '<hr>';//parse_str(): $_SERVER['QUERY_STRING'],将查询字符串以数组的方式返回parse_str($_SERVER['QUERY_STRING'], $res);print_r($res);echo '<hr>';// 生成一个查询字符串,模拟数据echo http_build_query(['id'=>20, 'email'=>'admin@php.cn', 'p'=>4]);// id=20&email=admin%40php.cn&p=4

<?phpnamespace mvc;class UserController{public function show($id, $name){return '你好!' . $name.',id= ' . $id;}}// array_filter()过滤掉空元素// array_values():将数据键名重置,从0开始$pathinfo = array_values(array_filter(explode('/',$_SERVER['PATH_INFO'])));// print_r($pathinfo);// 生成控制器名称// __NAMESPACE__返回命名空间,拼接,拿到完整$controller = __NAMESPACE__ . '\\' . ucfirst(array_shift($pathinfo)) . 'Controller';// 解析控制器方法:show$action = array_shift($pathinfo);// 测试从URL到控制器方法的访问映射// echo (new $controller)->$action();// echo call_user_func([(new $controller), $action]);// 从URL中解析出参数,跳过控制器和方法// 参数以path_info方式提供:/id/15/name/peter// print_r($pathinfo);此时$pathinfo保存着参数// print_r($pathinfo);// 数组只取id和name来显示,把没有值的排除掉$params = [];for ($i = 0; $i < count($pathinfo); $i+= 2) {if (isset($pathinfo[$i + 1])) $params[$pathinfo[$i]] = $pathinfo[$i + 1];}echo call_user_func_array([(new $controller), $action], $params);
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号