Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:完全理解了吗?如果让你实现一个闭包路由应该如何做呢?
路由原理:从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));
效果图: