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数组内存耗用太多问题的解决方法
Apr 05 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
Feb 13 PHP
PHP执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
Jun 26 PHP
推荐25款php中非常有用的类库
Sep 29 PHP
PHP正则表达式 /i, /is, /s, /isU等介绍
Oct 23 PHP
php5.3不能连接mssql数据库的解决方法
Dec 27 PHP
php实现zip文件解压操作
Nov 03 PHP
深入解析WordPress中加载模板的get_template_part函数
Jan 11 PHP
php求数组全排列,元素所有组合的方法
May 05 PHP
PHP反射机制原理与用法详解
Feb 15 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
Apr 15 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
Oct 10 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版快速排序、冒泡排序
2014/04/09 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
javascript中巧用“闭包”实现程序的暂停执行功能
2007/04/04 Javascript
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
2007/04/12 Javascript
25个好玩的JavaScript小游戏分享
2011/04/22 Javascript
最佳的addEvent事件绑定是怎样诞生的
2011/10/24 Javascript
用jQuery模拟页面加载进度条的实现代码
2011/12/19 Javascript
一个基于jquery的文本框记数器
2012/09/19 Javascript
jquery乱码与contentType属性设置问题解决方案
2013/01/07 Javascript
div当滚动到页面顶部的时候固定在顶部实例代码
2013/05/27 Javascript
javascript 对象数组根据对象object key的值排序
2015/03/09 Javascript
JavaScript简单下拉菜单实例代码
2015/09/07 Javascript
BootStrap树状图显示功能
2016/11/24 Javascript
Bootstrap3 datetimepicker控件使用实例
2016/12/13 Javascript
jquery自定义插件结合baiduTemplate.js实现异步刷新(附源码)
2016/12/22 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
vue框架搭建之axios使用教程
2018/07/11 Javascript
vue-cli3全面配置详解
2018/11/14 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
2019/04/23 Javascript
vue-cli3 引入 font-awesome的操作
2020/08/11 Javascript
JavaScript WeakMap使用详解
2021/02/05 Javascript
基于vue的video播放器的实现示例
2021/02/19 Vue.js
浅谈Python使用Bottle来提供一个简单的web服务
2017/12/27 Python
Django中反向生成models.py的实例讲解
2018/05/30 Python
Python序列类型的打包和解包实例
2019/12/21 Python
css3遮罩层镂空效果的多种实现方法
2020/05/11 HTML / CSS
idealfit英国:世界领先的女性健身用品和运动衣物品牌
2017/11/25 全球购物
HomeAway英国:全球领先的度假租赁在线市场
2020/02/03 全球购物
Ego Shoes官网:英国时髦鞋类品牌
2020/10/19 全球购物
高一历史教学反思
2014/01/13 职场文书
员工入职担保书范文
2014/04/01 职场文书
环境整治工作方案
2014/05/18 职场文书
小学综治宣传月活动总结
2014/07/02 职场文书
2014镇党委书记党建工作汇报材料
2014/11/02 职场文书
初中家长意见
2015/06/03 职场文书
工作后的感想
2015/08/07 职场文书