解刨mvc中pathinfo路由解析原理利用超全局函数拿到数组拿到的值,对值进行操作,操作后映射到方法中,解析http ://*.com/demo1.php/user/index/id/1/name/user代码部分:
<?php
namespace mvc;
class User
{
function index($id, $name)
{
return "您好{$name},您的id是$id";
}
}
// echo (new User)->index(1, 'pt');
// var_dump($_SERVER['PATH_INFO']);
// array_filter去除空字符 array_values将数组重新排序
$res = array_values(array_filter(explode("/", $_SERVER['PATH_INFO'])));
// var_dump($res);
$controller = __NAMESPACE__ . '\\' . array_shift($res);
//下面是方法名
var_dump($controller);
$method = array_shift($res);
// 下面是控制器名
var_dump($method);
var_dump($res);
// $params = ['id' => 1, 'name' => 'peter'];
// i等于0的时候 i自增0+2赋值给i i等于2,
for ($i = 0; $i < count($res); $i += 2) {
// array(4) {
// [0]=>
// string(2) "id"
// [1]=>
// string(1) "1"
// [2]=>
// string(4) "name"
// [3]=>
// string(4) "user"
// }
// 解释下下面,丫的 刚刚差点没理解 for是从0开始进入的 妈的 这一个点让我头疼了半天
// 第一次进来是$params[$res[$i]]是0 $res[$i + 1];为1,因为是从0开始的
// 第二次进来 i就是2了 $params[$res[$i]]就是2了 , $res[$i + 1];就是3
$params[$res[$i]] = $res[$i + 1];
}
// for上面实现的,下面是foreach实现的
var_dump($params); //这里的params跟下面的ress都是一个数组,随便用...
foreach ($res as $key => $value) {
$ress['id'] = $res['1'];
$ress['name'] = $res['3'];
}
var_dump($ress);
// 第一种解决方法
// $au = (new User)->index($ress['id'], $ress['name']);
// var_dump($au);
// 第二种回调的解决方法
$ca = call_user_func_array([(new $controller), $method], [$ress['id'], $ress['name']]);
// call_user_func_array 回调函数第一个值可以是一个数组,数组内第一个值是类名,第二个值是是类内的方法,第二个值是给第一个值注入的参数
// 在没有类的情况下,第一个值就是一个方法,并且支持引用传递
echo $ca;
//上面是将api地址解析成数组
//示例网址http://1.com/demo1.php/user/index/id/1/name/user
第二种,get方式传参,路由地址为/url/index?id=6&name=peter格式的
代码部分:
<?php
namespace mvc;
class url
{
public function index($name, $id)
{
return "当前用户为" . $name . '.' . '当前用户的id为' . $id;
}
}
var_dump($_SERVER['REQUEST_URI']);
$url = $_SERVER['REQUEST_URI'];//获取到路由的地址
$urlarr = parse_url($url);//将路由地址转数组
var_dump($urlarr['query']);
parse_str($urlarr['query'], $xarr);//将需要的get部分的路由地址转数组
var_dump($xarr);
echo (new url)->index($xarr['name'], $xarr['id']);//传值
// 上面是将1.com/demo2.php/url/index?id=6&name=peter 中的id=6&name=peter转换成数组
相关推荐
© 2020 asciim码
人生就是一场修行