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 相关文章推荐
提示Trying to clone an uncloneable object of class Imagic的解决
Oct 27 PHP
PHP跨时区(UTC时间)应用解决方案
Jan 11 PHP
关于PHP语言构造器介绍
Jul 08 PHP
phpphp图片采集后按原路径保存图片示例
Feb 18 PHP
php调用C代码的实现方法
Mar 11 PHP
PHP的password_hash()使用实例
Mar 17 PHP
PHP数据库连接mysql与mysqli对比分析
Jan 04 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
Sep 23 PHP
PHP带节点操作的无限分类实现方法详解
Nov 09 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
Feb 17 PHP
php实现的二分查找算法示例
Jun 20 PHP
Laravel第三方包报class not found的解决方法
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
PHP字符串 ==比较运算符的副作用
2009/10/21 PHP
解析strtr函数的效率问题
2013/06/26 PHP
php获取一个变量的名字的方法
2014/09/05 PHP
php使用Imagick生成图片的方法
2015/07/31 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
laravel框架分组控制器和分组路由实现方法示例
2020/01/25 PHP
权威JavaScript 中的内存泄露模式
2007/08/13 Javascript
JQuery实现自定义对话框的代码
2008/06/15 Javascript
javascript简单实现表格行间隔显示颜色并高亮显示
2013/11/29 Javascript
简体中文转换繁体中文(实现代码)
2013/12/25 Javascript
js常用自定义公共函数汇总
2014/01/15 Javascript
基于jQuery实现的文字按钮表单特效整理
2014/12/07 Javascript
js中split和replace的用法实例
2015/02/28 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
2015/03/01 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
Javascript页面跳转常见实现方式汇总
2015/11/28 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
你可能不知道的JSON.stringify()详解
2017/08/17 Javascript
BootStrap Validator 根据条件在JS中添加或移除校验操作
2017/10/12 Javascript
jQuery替换节点元素的操作方法
2018/03/18 jQuery
JavaScript栈和队列相关操作与实现方法详解
2018/12/07 Javascript
深入了解JS之作用域和闭包
2020/06/16 Javascript
vue 判断元素内容是否超过宽度的方式
2020/07/29 Javascript
原生JavaScript实现拖动校验功能
2020/09/29 Javascript
Python中.py文件打包成exe可执行文件详解
2017/03/22 Python
澳大利亚票务和娱乐市场领导者:Ticketmaster
2017/03/03 全球购物
马来西亚时装购物网站:ZALORA马来西亚
2017/03/14 全球购物
香港万宁官方海外旗舰店:香港健与美连锁店
2018/09/27 全球购物
百度软件工程师职位
2013/02/14 面试题
大学生毕业的自我鉴定
2013/11/13 职场文书
大学自我鉴定范文
2013/12/26 职场文书
库房管理员岗位职责
2014/03/09 职场文书
协议书样本
2014/04/23 职场文书
三下乡个人总结
2015/03/04 职场文书
MySQL库表名大小写的选择
2021/06/05 MySQL
python区块链持久化和命令行接口实现简版
2022/05/25 Python