Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:功能完成了
<?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 绑定成功
<?php
namespace mvc_test;
// 示例URL:-----> php.edu/luyou/demo3.php/my/show/peter/15
// 控制器
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);
// 取完名称和方法后,$pathinfo这个数组保存的值相当于就只剩类方法的参数了,所以直接回调
// 但是有一个问题是,如果URL中把peter和15的位置互换,那该怎么确定第一个参数表示name,第二个表示id呢?
// 我能想到的就是使用正则表达式对参数指定一些规则来验证,不过目前还不会正则表达式
echo call_user_func_array([(new $controller()),$action],$pathinfo);
<?php
namespace mvc_test;
// 示例URL:-----> php.edu/luyou/demo4.php/my/show/peter/15
// 控制器
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);