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的FTP学习(三)
Oct 09 PHP
用PHP制作的意见反馈表源码
Mar 11 PHP
php 编写安全的代码时容易犯的错误小结
May 20 PHP
解析PayPal支付接口的PHP开发方式
Nov 28 PHP
PHP防CC攻击实现代码
Dec 29 PHP
php PDO判断连接是否可用的实现方法
Apr 03 PHP
php批量删除操作(数据访问)
May 23 PHP
PHP实现网站访问量计数器
Oct 27 PHP
PHP去除空数组且数组键名重置的讲解
Feb 28 PHP
PHP自动生成缩略图函数的源码示例
Mar 18 PHP
PHP上传图片到数据库并显示的实例代码
Dec 20 PHP
如何在Laravel之外使用illuminate组件详解
Sep 20 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分页显示制作详细讲解
2008/11/19 PHP
javascript encodeURI和encodeURIComponent的比较
2010/04/03 Javascript
利用jquery操作select下拉列表框的代码
2010/06/04 Javascript
如何获取JQUERY AJAX返回的JSON结果集实现代码
2012/12/10 Javascript
javascript强大的日期函数代码分享
2013/09/04 Javascript
JQuery实现点击div以外的位置隐藏该div窗口
2013/09/13 Javascript
JavaScript调用后台的三种方法实例
2013/10/17 Javascript
javascript:json数据的页面绑定示例代码
2014/01/26 Javascript
jquery中post方法用法实例
2014/10/21 Javascript
jQuery 动态云标签插件
2014/11/11 Javascript
JavaScript获取各大浏览器信息图示
2015/11/20 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
2016/01/31 Javascript
详解jQuery lazyload 懒加载
2016/12/19 Javascript
js模拟微博发布消息
2017/02/23 Javascript
基于Bootstrap的网页设计实例
2017/03/01 Javascript
layui自定义插件citySelect实现省市区三级联动选择
2019/07/26 Javascript
js实现点击图片在屏幕中间弹出放大效果
2019/09/11 Javascript
vue 封装 Adminlte3组件的实现
2020/03/18 Javascript
vue 组件间的通信之子组件向父组件传值的方式
2020/07/29 Javascript
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
离线安装Pyecharts的步骤以及依赖包流程
2020/04/23 Python
python导入pandas具体步骤方法
2019/06/23 Python
Python3内置模块之base64编解码方法详解
2019/07/13 Python
用Python将Excel数据导入到SQL Server的例子
2019/08/24 Python
tensorflow中tf.slice和tf.gather切片函数的使用
2020/01/19 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
2021/01/27 Python
HTML5 微格式和相关的属性名称
2010/02/10 HTML / CSS
设计模式的基本要素是什么
2014/04/21 面试题
学生处主任岗位职责
2013/12/01 职场文书
副董事长岗位职责
2014/04/02 职场文书
公司活动总结范文
2014/07/01 职场文书
代收款委托书范本
2014/10/01 职场文书
学校拾金不昧表扬信
2015/01/16 职场文书
交通事故起诉书
2015/05/19 职场文书
迎客户欢迎词三篇
2019/09/27 职场文书
Python超简单容易上手的画图工具库推荐
2021/05/10 Python