PHP实现的简单路由和类自动加载功能


Posted in PHP onMarch 13, 2018

本文实例讲述了PHP实现的简单路由和类自动加载功能。分享给大家供大家参考,具体如下:

项目目录如下

入口文件index.php

<?php
define('WEBROOT', 'C:/Users/Administrator/Documents/NetBeansProjects/test');
require_once(WEBROOT.'/core/environment.php');
core__app::run(); //

类自动加载文件environment.php

<?php
//根据类名来include文件
class loader {
  //找到对应文件就include
  static function load($name) {
    $file = self::filepath($name);
    if ($file) {
      return include $file;
    }
  }
  static function filepath($name, $ext = '.php') {
    if (!$ext) {
      $ext = '.php';
    }
    $file = str_replace('__', '/', $name) . $ext; //类名转路径
    $path .= WEBROOT . '/' . $file;
    if (file_exists($path)) {
      return $path; //找到就返回
    }
    return null;
  }
}
spl_autoload_register('loader::load');

我这里类的加载规则是 比如core__app::run() 对应 根目录/core/app.php 的 run()方法,用到了spl_autoload_register()函数实现自动加载,当调用某个类名的时候,会自动执行spl_autoload_register('loader::load'),根据类名include对应的类文件。

app.php入口文件执行的方法开始跑框架流程

<?php
class core__app {
  static function run() {
    $a = $_SERVER['REQUEST_URI'];
    $uri = rtrim(preg_replace('/\?.*/', '', $_SERVER['REQUEST_URI']), '/');
    $params = explode('/', trim($uri, '/'));
    $count = count($params);
    if ($count > 1) {
      $controller = $params[0];
      $method = $params[1];
    } elseif ($count == 1) {
      $controller = 'index';
      $method = $params[0];
    } else {
    }
    $filename = WEBROOT . '/controller/' . $controller . '.php';
    $controller = 'controller__'.$controller;
    try {
      if (!file_exists($filename)) {
        throw new Exception('controller ' . $controller . ' is not exists!');
        return;
      }
      include($filename);
      if (!class_exists($controller)) {
        throw new Exception('class ' . $controller . ' is not exists');
        return;
      }
      $obj = new ReflectionClass($controller);
      if (!$obj->hasMethod($method)) {
        throw new Exception('method ' . $method . ' is not exists');
        return;
      }
    } catch (Exception $e) {
      echo $e; //展示错误结果
      return;
    }
    $newObj = new $controller();
    call_user_func_array(array($newObj, $method), $params);
  }
}

根据请求uri去找对应的controller, 用call_user_func_array()的方式调用controller里的方法

根目录/controller/test.php

<?php
class controller__test {
  public function write($controller, $method) {
    //config__test::load('test');
    model__test::write($controller, $method);
  }
}

这里其实调用不一定要调用model里的test方法,可以调model目录下的任意文件,在此之前可以去都读一些config文件等等操作。

根目录/model/test.php

<?php
class model__test {
  public function write($model, $method) {
    echo 'From controller:'.$model.' to model: ' . $model . ' ,method: ' . $method;
  }
}

例如hostname/test/write 这个请求就会从入口文件进来,经过core__app::run就会找到controller下对应的的controller__test类,执行write()方法

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP+MySQL 制作简单的留言本
Nov 02 PHP
一步一步学习PHP(2)――PHP类型
Feb 15 PHP
不重新编译PHP为php增加openssl模块的方法
Jun 14 PHP
php牛逼的面试题分享
Jan 18 PHP
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
Jun 21 PHP
php预定义变量使用帮助(带实例)
Oct 30 PHP
php制作中间带自己定义图片二维码的方法
Jan 27 PHP
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
Aug 23 PHP
[原创]php集成安装包wampserver修改密码后phpmyadmin无法登陆的解决方法
Nov 23 PHP
Laravel实现autoload方法详解
May 07 PHP
jQuery+PHP实现图片上传并提交功能
Jul 27 PHP
PHP实现文件上传与下载
Aug 28 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
Mar 12 #PHP
php把字符串指定字符分割成数组的方法
Mar 12 #PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
Mar 12 #PHP
php取出数组单个值的方法
Mar 12 #PHP
php合并数组并保留键值的实现方法
Mar 12 #PHP
php删除二维数组中的重复值方法
Mar 12 #PHP
PHP重置数组为连续数字索引的几种方式总结
Mar 12 #PHP
You might like
async和DOM Script文件加载比较
2014/07/20 PHP
php实用代码片段整理
2016/11/12 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
2020/03/23 PHP
测试你的JS的掌握程度的代码
2009/12/09 Javascript
JavaScript 解析Json字符串的性能比较分析代码
2009/12/16 Javascript
javascript 年月日联动实现核心代码
2009/12/21 Javascript
Javascript学习笔记9 prototype封装继承
2010/01/11 Javascript
可以将word转成html的js代码
2010/04/11 Javascript
jquery load()在firefox(火狐)下显示不正常的解决方法
2011/04/05 Javascript
js FLASH幻灯片字符串中有连接符&的处理方法
2012/03/01 Javascript
js自定义方法通过隐藏iframe实现文件下载
2013/02/21 Javascript
jquery获取一个元素下面相同子元素的个数代码
2014/07/31 Javascript
jQuery Validation PlugIn的使用方法详解
2015/12/18 Javascript
AngularJS基础 ng-include 指令示例讲解
2016/08/01 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
在Swiper内如何制作CSS3动画效果示例代码
2017/12/07 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
d3绘制基本的柱形图的实现代码
2018/12/12 Javascript
微信小程序实现富文本图片宽度自适应的方法
2019/01/20 Javascript
vue操作动画的记录animate.css实例代码
2019/04/26 Javascript
JS求1到任意数之间的所有质数的方法详解
2019/05/20 Javascript
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
2019/07/29 Javascript
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
Python实现批量修改文件名实例
2015/07/08 Python
Python表示矩阵的方法分析
2017/05/26 Python
Python中常用信号signal类型实例
2018/01/25 Python
Django Channel实时推送与聊天的示例代码
2020/04/30 Python
python 实现图片批量压缩的示例
2020/12/18 Python
车辆维修工自我评价怎么写
2013/09/20 职场文书
设计部经理的岗位职责
2013/11/16 职场文书
简历中求职的个人自我评价
2013/12/03 职场文书
入党介绍人评语
2014/05/06 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
2015国庆节66周年演讲稿
2015/03/20 职场文书
刑事申诉状范文
2015/05/20 职场文书