这里有新鲜出炉的PHP教程,程序狗速度看过来!
PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适用于web开发领域。PHP的文件后缀名为php。
这篇文章主要为大家详细介绍了PHP实现路由映射到指定控制器的相关资料,感兴趣的小伙伴们可以参考一下
自定义路由的功能,指定到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']} 的文章列表";
- }
- }
效果呢:
来源: http://www.phperz.com/article/17/0829/343011.html