批改状态:合格
老师批语:实现路由的方式, 解析url的方式有多种的, 老师的只是基本一种而已
<?php// 解析URL,绑定到类方法namespace mvc_test;class MyController{public function show ($id,$p){return 'id='.$id.'----'.'p='.$p;}}// 示例: URL为----> php.edu/luyou/demo2.php/my/show/id/10/p/5// 1. 获取路径// echo $_SERVER['PATH_INFO']; ----> /my/show/id/10/p=5// print_r(explode("/",$_SERVER['PATH_INFO']));// Array// (// [0] =>// [1] => my// [2] => show// [3] => id// [4] => 10// [5] => p// [6] => 5// )// 使用array_filter() 过滤空元素// 使用array_values() 将数据键名重置,从0开始$pathinfo = array_values(array_filter(explode("/",$_SERVER['PATH_INFO'])));// print_r($pathinfo);// Array// (// [0] => my// [1] => show// [2] => id// [3] => 10// [5] => p// [6] => 5// )// 2. 解析路径// $controller = array_shift($pathinfo);// echo $controller; ----> my$controller = __NAMESPACE__."\\".ucfirst(array_shift($pathinfo))."Controller";// echo $controller; -----> mvc_test\MyController// print_r($pathinfo);// Array// (// [0] => show// [1] => id// [2] => 10// [3] => p// [4] => 5// )$action = array_shift($pathinfo);// echo $action; ----> show// 测试从URL到控制器方法的映射// echo (new $controller())->$action(2,5);// id=2----p=5// 测试映射成功,现在来取参数// print_r($pathinfo);// Array// (// [0] => id// [1] => 10// [2] => p// [3] => 5// )$params = [];for ($i=0;$i<count($pathinfo);$i+=2) {// 加上判断,防止后面还有不认识的参数(无值的参数)if (isset($pathinfo[$i+1])){$params[$pathinfo[$i]] = $pathinfo[$i+1];}}// print_r($params);// Array// (// [id] => 10// [p] => 5// )echo call_user_func_array([(new $controller()),$action],$params);// 最后输出 id=10----p=5 绑定成功
<?phpnamespace mvc_test;// 示例URL:-----> php.edu/luyou/demo3.php/my/show/demo/11// 控制器class MyController{public function show ($name,$id){return '姓名: '.$name.'<br>'.'id: '.$id;}}// 获取路径:方法一:$pathinfo = array_values(array_filter(explode("/",$_SERVER['PATH_INFO'])));// 类名称$controller = __NAMESPACE__."\\".ucfirst(array_shift($pathinfo))."Controller";// 类方法$action = array_shift($pathinfo);echo call_user_func_array([(new $controller()),$action],$pathinfo);
<?phpnamespace mvc_test;// 示例URL:-----> php.edu/luyou/demo4.php/my/show/demo/11// 控制器class MyController{public function show ($name,$id){return '姓名: '.$name.'<br>'.'id: '.$id;}}// 获取路径:方法二:$pathinfo = explode("/",substr($_SERVER['PATH_INFO'],1));// 类名称$controller = __NAMESPACE__."\\".ucfirst(array_shift($pathinfo))."Controller";// 类方法$action = array_shift($pathinfo);echo call_user_func_array([(new $controller()),$action],$pathinfo);
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号