批改状态:合格
老师批语:完全理解了吗?如果让你实现一个闭包路由应该如何做呢?
路由原理:从url地址中解析数据。
_GET: 返回查询字符串拆解的数组implode(): 将数组切割成字符串vprintf:按照指定模板打印$_SERVER['QUERY_STRING'];获取url地址的查询字符串$_SERVER['PATH_INFO'];获取地址的PATHINFO变量/ 路径变量$_SERVER['REQUEST_URI'];获取相对于当前主机名下的文件的绝对路径
<?php// 写一个简单的控制器class MyController{public function getInfor($name, $salary){return "员工姓名: ==> $name, 工资: ==> $salary";}}// http://php.io/0514/route.php/MyController/getInfor/?name=dashu&salary=10000// 1. 解析出PATHINFO$pathinfo = array_values(array_filter(explode('/', $_SERVER['PATH_INFO'])));// print_r($pathinfo);// 2. 解析控制器$controller = ucfirst(array_shift($pathinfo));// 3. 解析控制器中的方法$action = array_shift($pathinfo);// 4. 解析参数parse_str($_SERVER['QUERY_STRING'], $params);// 5. 调用控制器方法$mycontroller = new $controller();echo $mycontroller->$action(...array_values($params));
效果图:

<?php// 写一个简单的控制器class MyController{public function getInfor($name, $salary){return "领导姓名: ==> $name, 领导工资: ==> $salary";}}// http://php.io/0514/route1.php/MyController/getInfor/name=sep&salary=30000// 1. 解析出PATHINFO$pathinfo = array_values(array_filter(explode('/', $_SERVER['PATH_INFO'])));// print_r($pathinfo);// 2. 解析控制器$controller = ucfirst(array_shift($pathinfo));// 3. 解析控制器中的方法$action = array_shift($pathinfo);// print_r($pathinfo);// 4. 解析参数: pathinfo路径变量// 这里放的是从pathinfo中解析出来的变量组成的数组$params = [];for ($i=0; $i<count($pathinfo); $i+=2) {// 检查当前pathinfo变量是否有值?if (isset($pathinfo[$i+1])){$params[$pathinfo[$i]] = $pathinfo[$i+1];}}// print_r($params);// 5. 调用控制器方法$mycontroller = new $controller();echo $mycontroller->$action(...array_values($params));
效果图:

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