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 随机排序广告的实现代码
May 09 PHP
php生成不重复随机数、数组的4种方法分享
Mar 30 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
Apr 15 PHP
PHP入门教程之上传文件实例详解
Sep 11 PHP
搜索附近的人PHP实现代码
Feb 11 PHP
php use和include区别总结
Oct 13 PHP
解决laravel资源加载路径设置的问题
Oct 14 PHP
laravel框架select2多选插件初始化默认选中项操作示例
Feb 18 PHP
PHP 实现 WebSocket 协议原理与应用详解
Apr 22 PHP
PHP强制转化的形式整理
May 22 PHP
php7连接MySQL实现简易查询程序的方法
Oct 13 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
程序员编程十条戒律
2009/07/09 PHP
解析PHP汉字转换拼音的类
2013/06/18 PHP
PHP集成百度Ueditor 1.4.3
2014/11/23 PHP
php的instanceof和判断闭包Closure操作示例
2020/01/26 PHP
Jquery设置attr的disabled属性控制某行显示或者隐藏
2014/09/25 Javascript
JavaScript不使用prototype和new实现继承机制
2014/12/29 Javascript
浅谈类似于(function(){}).call()的js语句
2015/03/30 Javascript
jQuery插件datalist实现很好看的input下拉列表
2015/07/14 Javascript
浅谈js的html元素的父节点,子节点
2016/08/06 Javascript
AngularJS ng-repeat指令中使用track by子语句解决重复数据遍历错误问题
2017/01/21 Javascript
Bootstrap按钮组简单实现代码
2017/03/06 Javascript
基于JavaScript实现的插入排序算法分析
2017/04/14 Javascript
微信小程序日历组件calendar详解及实例
2017/06/08 Javascript
实例学习JavaScript读取和写入cookie
2018/01/29 Javascript
vue组件传递对象中实现单向绑定的示例
2018/02/28 Javascript
Vue动态控制input的disabled属性的方法
2018/06/26 Javascript
vue项目中axios请求网络接口封装的示例代码
2018/12/18 Javascript
react 组件传值的三种方法
2019/06/03 Javascript
Vue实现push数组并删除的例子
2019/11/01 Javascript
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
浅要分析Python程序与C程序的结合使用
2015/04/07 Python
Python机器学习之决策树算法
2017/12/22 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
2018/04/17 Python
TensorFlow Session会话控制&amp;Variable变量详解
2018/07/30 Python
keras中的backend.clip用法
2020/05/22 Python
Python configparser模块操作代码实例
2020/06/08 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
python在linux环境下安装skimage的示例代码
2020/10/14 Python
德国汉莎航空中国官网: Lufthansa中国
2017/03/30 全球购物
Qoo10台湾站:亚洲领先的在线市场
2018/05/15 全球购物
说明书怎么写
2014/05/06 职场文书
学生保证书格式
2015/02/27 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
二年级作文之动物作文
2019/11/13 职场文书