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 相关文章推荐
如何限制访问者的ip(PHPBB的代码)
Oct 09 PHP
PHP在特殊字符前加斜杠的实现代码
Jul 17 PHP
细谈php中SQL注入攻击与XSS攻击
Jun 10 PHP
ajax在joomla中的原生态应用代码
Jul 19 PHP
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
Jun 03 PHP
使用php检测用户当前使用的浏览器是否为IE浏览器
Dec 03 PHP
Laravel 5框架学习之路由、控制器和视图简介
Apr 07 PHP
php获取、检查类名、函数名、方法名的函数方法
Jun 25 PHP
PHP获取网页所有连接的方法(附demo源码下载)
Mar 30 PHP
php实现微信公众平台发红包功能
Jun 14 PHP
PHP实现负载均衡的加权轮询方法分析
Aug 22 PHP
解决Laravel无法使用COOKIE和SESSION的问题
Oct 16 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
php ZipArchive压缩函数详解实例
2013/11/06 PHP
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
Docker配置PHP开发环境教程
2016/12/21 PHP
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
使用Jquery来实现可以输入值的下拉选单 雏型
2011/12/06 Javascript
从URL中提取参数与将对象转换为URL查询参数的实现代码
2012/01/12 Javascript
javascript的offset、client、scroll使用方法详解
2012/12/25 Javascript
JS 退出系统并跳转到登录界面的实现代码
2013/06/29 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
2014/02/12 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/06/05 Javascript
jquery中使用循环下拉菜单示例代码
2014/09/24 Javascript
jQuery解析XML与传统JavaScript方法的差别实例分析
2015/03/05 Javascript
jQuery实现仿百度帖吧头部固定导航效果
2015/08/07 Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
2016/10/30 Javascript
详解vue-cli中配置sass
2017/06/21 Javascript
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
2018/02/21 Javascript
angular4 JavaScript内存溢出问题
2018/03/06 Javascript
Vue侦测相关api的实现方法
2019/05/22 Javascript
vue-cli随机生成port源码的方法
2019/09/02 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
2019/11/14 Javascript
python发送伪造的arp请求
2014/01/09 Python
Python书单 不将就
2017/07/11 Python
python删除字符串中指定字符的方法
2018/08/13 Python
Python动态语言与鸭子类型详解
2019/07/01 Python
Python之关于类变量的两种赋值区别详解
2020/03/12 Python
Python使用pickle进行序列化和反序列化的示例代码
2020/09/22 Python
python 下载文件的几种方法汇总
2021/01/06 Python
使用CSS3编写类似iOS中的复选框及带开关的按钮
2016/04/11 HTML / CSS
美国最大的骑马用品零售商:HorseLoverZ
2017/01/12 全球购物
俄罗斯家居用品购物网站:Евродом
2020/11/21 全球购物
金融专业推荐信
2013/11/14 职场文书
新闻传媒系求职信范文
2014/04/19 职场文书
合作协议书
2014/04/23 职场文书
节能环保家庭事迹材料
2014/08/27 职场文书
就业意向书范本
2015/05/11 职场文书