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 相关文章推荐
一个MYSQL操作类
Nov 16 PHP
PHP高级OOP技术演示
Aug 27 PHP
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
Nov 26 PHP
getimagesize获取图片尺寸实例
Nov 15 PHP
php结合正则批量抓取网页中邮箱地址
May 19 PHP
php生成Android客户端扫描可登录的二维码
May 13 PHP
PHP更安全的密码加密机制Bcrypt详解
Jun 18 PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
Aug 03 PHP
php插件Xajax使用方法详解
Aug 31 PHP
使用Zookeeper分布式部署PHP应用程序
Mar 15 PHP
laravel返回统一格式错误码问题
Nov 04 PHP
HTTP头隐藏PHP版本号实现过程解析
Dec 09 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+SQL 注入攻击的技术实现以及预防办法
2011/01/27 PHP
PHP sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
phpcms模块开发之swfupload的使用介绍
2013/04/28 PHP
zf框架的session会话周期及次数限制使用示例
2014/03/13 PHP
php生成图片验证码-附五种验证码
2015/08/19 PHP
PHP使用xpath解析XML的方法详解
2017/05/20 PHP
PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)
2017/05/30 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
2019/10/11 PHP
PHP使用PDO 连接与连接管理操作实例分析
2020/04/21 PHP
一个用js实现控制台控件的代码
2007/09/04 Javascript
jQuery 第二课 操作包装集元素代码
2010/03/14 Javascript
javascript计时器事件使用详解
2014/01/07 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
2016/02/16 Javascript
Bootstrap面板使用方法
2017/01/16 Javascript
浅谈JS如何实现真正的对象常量
2017/06/25 Javascript
js CSS3实现卡牌旋转切换效果
2017/07/04 Javascript
JS获取当前地理位置的方法
2017/10/25 Javascript
通过nodejs 服务器读取HTML文件渲染到页面的方法
2018/05/17 NodeJs
vue 强制组件重新渲染(重置)的两种方案
2019/10/29 Javascript
python基础教程之字典操作详解
2014/03/25 Python
详解Python如何生成词云的方法
2018/06/01 Python
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
Python3 io文本及原始流I/O工具用法详解
2020/03/23 Python
水芝澳美国官网:H2O Plus
2016/10/15 全球购物
购买瑞典当代设计的腕表和太阳眼镜:TRIWA
2016/10/30 全球购物
日本即尚网:JSHOPPERS.com(支持中文)
2019/12/03 全球购物
兰蔻俄罗斯官方网站:Lancome俄罗斯
2019/12/09 全球购物
如何开启linux的ssh服务
2013/06/03 面试题
学生会竞选自荐信
2013/10/12 职场文书
股份合作协议书
2014/04/12 职场文书
煤矿安全知识竞赛活动总结
2014/07/07 职场文书
Python django中如何使用restful框架
2021/06/23 Python
idea搭建可运行Servlet的Web项目
2021/06/26 Java/Android
使用 Apache Dubbo 实现远程通信(微服务架构)
2022/02/12 Servers
JS实现简单九宫格抽奖
2022/06/28 Javascript