案例代码:
1、url地址:两种形式
第一种:http://php.edu/route/demo.php/a/b?p=1&m=3
第二种:http://php.edu/route/demo.php/a/b/p/1/m/3
第一种解析代码1
<?php
echo $_SERVER['PATH_INFO'],'<br>';
echo $_SERVER['PHP_SELF'],'<br>';
echo $_SERVER['SERVER_ADDR'],'<br>';
echo $_SERVER['SERVER_NAME'],'<br>';
echo $_SERVER['REQUEST_METHOD'],'<br>';
echo $_SERVER['QUERY_STRING'],'<br>';
echo '<a href="demo2.php">显示前一个页面的url;$_SERVER[\'HTTP_REFERER\']</a>','<br>';
echo $_SERVER['SCRIPT_FILENAME'],'<br>';
echo $_SERVER['SCRIPT_NAME'],'<br>';
echo $_SERVER['SERVER_PORT'],'<br>';
echo $_SERVER['REQUEST_URI'],'<br>';
echo '<hr>';
echo print_r($_GET,true),'<br>';
echo implode(',', $_GET),'<br>';
vprintf('?p=%s&m=%s', $_GET);
echo '<br>';
// url类型
echo 'url类型:','<br>';
echo "第一种url:http://php.edu/route/demo.php/a/b?p=1&m=3",'<br>';
echo "第二种url:http://php.edu/route/demo.php/a/b/p/1/m/3",'<br>';
echo '<hr>';
echo '<h3>第一种url解析</h3>';
// 第一种路由解析
$cm=explode('/',$_SERVER['PATH_INFO']);
$cm=array_values(array_filter($cm));
// 解析出类和方法
$method=array_pop($cm);//尾部出
$class=ucfirst(array_shift($cm));//头部出
$params=$_SERVER['QUERY_STRING'];
// print_r($params);
parse_str($params,$agu);
// print_r(array_values($agu));
// $url=parse_url('http://php.edu/route/demo.php/a/b?p=1&m=3');
// 调用类
class A
{
public function b($n,$m)
{
return sprintf('当前类:%s<br>当前方法:%s<br>当前参数:%s,%s',__CLASS__,__METHOD__,$n,$m);
}
}
$c=new $class();
echo $c->$method(...array_values($agu));
第二种解析代码2
<?php
echo @$_SERVER['HTTP_REFERER'];
// url类型
echo 'url类型:','<br>';
echo "第一种url:http://php.edu/route/demo.php/a/b?p=1&m=3",'<br>';
echo "第二种url:http://php.edu/route/demo.php/a/b/p/1/m/3",'<br>';
echo '<hr>';
echo '<h3>第一种url解析</h3>';
// 第二种路由解析
// print_r($_SERVER['PATH_INFO']);
$cm=explode('/',$_SERVER['PATH_INFO']);
$cm=array_values(array_filter($cm));
// print_r($cm);
// 解析出类和方法
$class=ucfirst(array_shift($cm));//头部出
$method=array_shift($cm);//头部出
//解析参数
$params=[];
for($i=0;$i<count($cm);$i+=2){
if(isset($cm[$i+1])){
$params[$cm[$i]]=$cm[$i+1];
}
}
// print_r($params);
// 调用类
class A
{
public function b($n,$m)
{
return sprintf('当前类:%s<br>当前方法:%s<br>当前参数:%s,%s',__CLASS__,__METHOD__,$n,$m);
}
}
$c=new $class();
echo $c->$method(...array_values($params));
演示结果:
总结
1、路由原理::将URL中的控制器,方法和参数解析出来,映射到对应的控制器类和方法上
2、路由常用函数:$_GET
获取参数返回参数数组;$_SERVER['QUERY_STRING']
获取参数组成的字符串,url地址中?后面的部分;$SERVER['PATH_INFO']
获取路径变量,跟在文件后面的变量例如php.edu/route/demo1.php/a/b 中的 /a/b
;array_filter()
过滤数组中的空值,array_values()把二维数组的值取出重排;array_shift()
从数组头部取出一个;parse_str($str,$array)
把一个查询字符串解析成数组返回;explode('分割字符','字符串')
按分隔符把字符串解析成一个变量;ucfirst($str)
把字符串首字母大写;