批改状态:合格
老师批语:路由是任何框架都具体的基本功能, http请求通过路由发送
第一种:http://php.edu/route/demo.php/a/b?p=1&m=3
第二种:http://php.edu/route/demo.php/a/b/p/1/m/3
<?phpecho $_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));
<?phpecho @$_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)把字符串首字母大写;
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号