php映射,[PHP] 实现路由映射到指定控制器详解

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 functioncommandLine(){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 functionshutdownCallback(){$e=error_get_last();if(!$e) return;

self::myErrorHandler($e['type'],'Fatal Error '.$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="
";

}$mes="[".date("Y-m-d H:i:s",$seconds).":{$micseconds}] ".$errfile." ".$errline." line ".$errstr.$break;echo $mes;

}//注册

public static functionregister(){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");

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值