自定义路由的功能,指定到pathinfo的url上,再次升级之前的脚本

SimpleLoader.php

<?php
class SimpleLoader{
public static function run($rules=array()){
header("content-type:text/html;charset=utf-8");
self::register();
self::commandLine();
self::router($rules);
self::pathInfo();
}
//自动加载
public static function loadClass($class){
$class=str_replace('\\', '/', $class);
$dir=str_replace('\\', '/', __DIR__);
$class=$dir."/".$class.".php";
if(!file_exists($class)){
header("HTTP/1.1 404 Not Found");
}
require_once $class;
}
//命令行模式
public static function commandLine(){
if(php_sapi_name()=="cli"){
$_SERVER['PATH_INFO']="";
foreach ($_SERVER['argv'] as $k=>$v) {
if($k==0) continue;
$_SERVER['PATH_INFO'].="/".$v;
}
}
}
//路由模式
public static function router($rules){
if(isset($_SERVER['PATH_INFO']) && !empty($rules)){
$pathInfo=ltrim($_SERVER['PATH_INFO'],"/");
foreach ($rules as $k=>$v) {
$reg="/".$k."/i";
if(preg_match($reg,$pathInfo)){
$res=preg_replace($reg,$v,$pathInfo);
$_SERVER['PATH_INFO']='/'.$res;
}
}
}
}
//pathinfo处理
public static function pathInfo(){
if(isset($_SERVER['PATH_INFO'])){
$pathinfo=array_filter(explode("/", $_SERVER['PATH_INFO']));
for($i=1;$i<=count($pathinfo);$i++){
$key=isset($pathinfo[$i]) ? $pathinfo[$i] : '';
$value=isset($pathinfo[$i+1]) ? $pathinfo[$i+1] :"";
switch ($i) {
case 1:
$_GET['m']=ucfirst($key);
break;
case 2:
$_GET['c']=ucfirst($key);
break;
case 3:
$_GET['a']=$key;
break;
default:
if($i>3){
if($i%2==0){
$_GET[$key]=$value;
}
}
break;
}
}
}
$_GET['m']=!empty($_GET['m']) ? ucfirst($_GET['m']) : 'Index';
$_GET['c']=!empty($_GET['c']) ? ucfirst($_GET['c']) : 'Index';
$_GET['a']=!empty($_GET['a']) ? $_GET['a'] : 'index';
$class="\\Controller\\{$_GET['m']}\\{$_GET['c']}";
$controller=new $class;
if(method_exists($controller, $_GET['a'])){
$controller=new $class;
$controller->$_GET['a']();
}else{
header("HTTP/1.1 404 Not Found");
echo "404";
}
}
//致命错误回调
public static function shutdownCallback(){
$e=error_get_last();
if(!$e) return;
self::myErrorHandler($e['type'],'<font color="red">Fatal Error</font> '.$e['message'],$e['file'],$e['line']);
}
//错误处理
protected static function myErrorHandler($errno,$errstr,$errfile,$errline){
list($micseconds,$seconds)=explode(" ",microtime());
$micseconds=round($micseconds*1000);
$micseconds=strlen($micseconds)==1 ? '0'.$micseconds : $micseconds;
if(php_sapi_name()=="cli"){
$break="\r\n";
}else{
$break="<br/>";
}
$mes="[".date("Y-m-d H:i:s",$seconds).":{$micseconds}] ".$errfile." ".$errline." line ".$errstr.$break;
echo $mes;
}
//注册
public static function register(){
error_reporting(0);
set_error_handler(function($errno,$errstr,$errfile,$errline){
self::myErrorHandler($errno,$errstr,$errfile,$errline);
});
register_shutdown_function(function(){
self::shutdownCallback();
});
spl_autoload_register("self::loadClass");
}
}

如何使用

index.php

<?php
//路由映射
$rules=array(
'^user$'=>'User/User/getUserList',
'^user\/(\d+)$'=>'User/User/getUserById/id/$1',
'^user\/(\d+)\/article$'=>'User/User/getUserArticle/uid/$1'
);
require_once "SimpleLoader.php";
SimpleLoader::run($rules);

控制器啥样

\Controller\User\User.php

<?php
namespace Controller\User; class User{
public function getUserById(){
echo "用户信息id {$_GET['id']} 的信息";
}
public function getUserList(){
echo "用户列表";
}
public function getUserArticle(){
echo "用户id {$_GET['uid']} 的文章列表";
}
}

效果呢:

最新文章

  1. java-IO
  2. 日志记录类库log4net的使用总结
  3. Channel States
  4. jira attachement directorey,workflow---extention.
  5. POJ1502: MPI Maelstrom
  6. Delphi应用程序的调试(十)调试器选项(在IDE中不要使用异常)
  7. HDU 2510 - 符号三角形
  8. 十大经典数据挖掘算法(9) 朴素贝叶斯分类器 Naive Bayes
  9. 利用线程把文本文件填充到richTextBox;防止导入大文本文件窗口假死现象
  10. iOS-改变UITextField的Placeholder颜色的三种方式
  11. 在经过身份验证的服务中不支持跨域 javascript 回调
  12. scrum学习
  13. LeetCode算法题-Construct Quad Tree(Java实现)
  14. 【代码审计】XYHCMS V3.5文件上传漏洞分析
  15. 四、Factory Method 工厂方法模式
  16. Python_oldboy_自动化运维之路(二)
  17. FusionMap 检测融合基因
  18. MVC中用View.bag保存json字符串。在js中使用,不用ajax请求。。。。
  19. poj_3185 反转问题
  20. 【转】Deep Learning(深度学习)学习笔记整理系列之(七)

热门文章

  1. mac os x 安装mysql遇到 Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: YES)的解决方法
  2. struts2:上传多个文件时实现带进度条、进度详细信息的示范
  3. [AX2012]Claims user
  4. System.Diagnostics.Stopwatch
  5. Android使用BLE(低功耗蓝牙,Bluetooth Low Energy)
  6. .Net基础
  7. 做最好的日期控件,My97 DatePicker 4.8 Beta4
  8. java数据库连接池性能对比
  9. java--实现将文字生成二维码图片,并在中间附上logo,下方附上文字
  10. react native之组织组件