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 相关文章推荐
基于Discuz security.inc.php代码的深入分析
Jun 03 PHP
php实现的替换敏感字符串类实例
Sep 22 PHP
PHP实现一维数组转二维数组的方法
Feb 25 PHP
实例讲解如何在PHP的Yii框架中进行错误和异常处理
Mar 17 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
Mar 18 PHP
PHP与Java对比学习日期时间函数
Jul 03 PHP
微信支付开发告警通知实例
Jul 12 PHP
php实现给二维数组中所有一维数组添加值的方法
Feb 04 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
Aug 31 PHP
php之可变函数的实例详解
Sep 13 PHP
Thinkphp5.0框架视图view的循环标签用法示例
Oct 12 PHP
Yii redis集合的基本使用教程
Jun 14 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
thinkphp使用literal防止模板标签被解析的方法
2014/11/22 PHP
jquery text,radio,checkbox,select操作实现代码
2009/07/09 Javascript
JavaScript Event学习第三章 早期的事件处理程序
2010/02/07 Javascript
基于jQuery的图片左右无缝滚动插件
2012/05/23 Javascript
怎样在JavaScript里写一个swing把数据插入数据库
2012/12/10 Javascript
js遍历td tr等html元素
2012/12/13 Javascript
jQuery对val和atrr(&quot;value&quot;)赋值的区别介绍
2014/09/26 Javascript
自定义刻度jQuery进度条及插件
2015/09/02 Javascript
javascript基础知识
2016/06/07 Javascript
JS基础随笔(菜鸟必看篇)
2016/07/13 Javascript
jquery easyUI中ajax异步校验用户名
2016/08/19 Javascript
将鼠标焦点定位到文本框最后(代码分享)
2017/01/11 Javascript
vue图片加载与显示默认图片实例代码
2017/03/16 Javascript
Angular4 Select选择改变事件的方法
2018/10/09 Javascript
vue的for循环使用方法
2019/02/12 Javascript
cordova+vue+webapp使用html5获取地理位置的方法
2019/07/06 Javascript
[10:04]国际邀请赛采访专栏:DK.Farseer,mouz.Black^,采访员Josh专访
2013/08/05 DOTA
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
Python中的is和id用法分析
2015/01/26 Python
Python中decorator使用实例
2015/04/14 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
2018/05/04 Python
win8下python3.4安装和环境配置图文教程
2018/07/31 Python
python3.6利用pyinstall打包py为exe的操作实例
2018/10/31 Python
Python学习笔记之Django创建第一个数据库模型的方法
2019/08/07 Python
Tensorflow 卷积的梯度反向传播过程
2020/02/10 Python
python把一个字符串切开的实例方法
2020/09/27 Python
Python3使用 GitLab API 进行批量合并分支
2020/10/15 Python
css3 border-image使用说明
2010/06/23 HTML / CSS
CSS去掉A标签(链接)虚线框的方法
2014/04/01 HTML / CSS
推荐WEB开发者最佳HTML5和CSS3代码生成器
2015/11/24 HTML / CSS
美国山地自行车、露营、户外装备和服装购物网站:Aventuron
2018/05/05 全球购物
台湾三立电视电商平台:电电购
2019/09/09 全球购物
JSF面试题:Jsf中导航的标签是什么
2013/04/20 面试题
婚礼长辈答谢词
2015/09/29 职场文书
教学反思怎么写
2016/02/24 职场文书
利用python做表格数据处理
2021/04/13 Python