PHP實(shí)現(xiàn)路由映射到指定控制器
自定義路由的功能,指定到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";
}
}
//致命錯誤回調(diào)
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']} 的文章列表";
}
}
效果呢:



以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解PHP的Laravel框架中Eloquent對象關(guān)系映射使用
- ThinkPHP中公共函數(shù)路徑和配置項(xiàng)路徑的映射分析
- 回答PHPCHINA上的幾個問題:URL映射
- 解密ThinkPHP3.1.2版本之模塊和操作映射
- 淺析php設(shè)計(jì)模式之?dāng)?shù)據(jù)對象映射模式
- PHP面向?qū)ο笾I(lǐng)域模型+數(shù)據(jù)映射器實(shí)例(分析)
- 老生常談PHP面向?qū)ο笾畼?biāo)識映射
- PHP實(shí)現(xiàn)的數(shù)據(jù)對象映射模式詳解
- PHP數(shù)據(jù)對象映射模式實(shí)例分析
- php實(shí)現(xiàn)映射操作實(shí)例詳解
相關(guān)文章
深入file_get_contents與curl函數(shù)的詳解
本篇文章是對file_get_contents與curl函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
異步加載技術(shù)實(shí)現(xiàn)當(dāng)滾動條到最底部的瀑布流效果
當(dāng)滾動條到最底部的時候觸發(fā)一個事件,這個事件寫入$.get()事件,實(shí)現(xiàn)瀑布流效果,下面試具體的實(shí)現(xiàn)2014-09-09
PHP Swoole異步MySQL客戶端實(shí)現(xiàn)方法示例
這篇文章主要介紹了PHP Swoole異步MySQL客戶端實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了php操作Swoole擴(kuò)展異步mysql操作的面向?qū)ο髮?shí)現(xiàn)方式,需要的朋友可以參考下2019-10-10
PHP中4個加速、緩存擴(kuò)展的區(qū)別和選用建議
這篇文章主要介紹了PHP中eAccelerator、memcached、xcache、APC等4個加速、緩存擴(kuò)展的區(qū)別和選用建議,需要的朋友可以參考下2014-03-03
PHP管理內(nèi)存函數(shù) memory_get_usage()使用介紹
我們在實(shí)際編碼中,要想實(shí)現(xiàn)對內(nèi)存的查看和操作,許多程序員們第一個想到的就是PHP memory_get_usage()這個PHP腳本內(nèi)存函數(shù)2012-09-09
使用php轉(zhuǎn)義輸出HTML到JavaScript
本文給大家分享的是個人項(xiàng)目中的一個小需求,需要使用php轉(zhuǎn)義輸出HTML到JavaScript,就寫了個function,推薦給大家,希望大家能夠喜歡。2015-03-03

