Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:对url的解析 有许多方法的 , 其实js也可以做到的
<?php
// 路由原理
// 只要是采用MVC架构的项目,它的URL最终都会映射到一个类中的方法上(函数)
// http://php.edu/0805/demo1.php?controler=user&action=show
class 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/show
echo $_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
<?php
namespace 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);