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开发过程中常用函数收藏
Dec 14 PHP
php HandlerSocket的使用
May 02 PHP
Yii框架获取当前controlle和action对应id的方法
Dec 03 PHP
php程序总是提示验证码输入有误解决方案
Jan 07 PHP
Codeigniter实现发送带附件的邮件
Mar 19 PHP
使用PHPCMS搭建wap手机网站
Sep 20 PHP
优化WordPress的Google字体以加速国内服务器上的运行
Nov 24 PHP
mysql_escape_string()函数用法分析
Apr 25 PHP
php文件管理基本功能简单操作
Jan 16 PHP
PHP实现对xml的增删改查操作案例分析
May 19 PHP
使用composer命令加载vendor中的第三方类库 的方法
Jul 09 PHP
解决PhpStorm64不能启动的问题
Jun 20 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入门源程序
2006/10/09 PHP
drupal 代码实现URL重写
2011/05/04 PHP
PHP的异常处理类Exception的使用及说明
2012/06/13 PHP
PHP操作Redis数据库常用方法示例
2018/08/25 PHP
一些常用的JavaScript函数(json)附详细说明
2011/05/25 Javascript
chrome浏览器不支持onmouseleave事件的解决技巧
2013/05/31 Javascript
js数组方法扩展实现数组统计函数
2014/04/09 Javascript
JS截取url中问号后面参数的值信息
2014/04/29 Javascript
jquery.idTabs 选项卡使用示例代码
2014/09/03 Javascript
javascript字符串与数组转换汇总
2015/05/26 Javascript
JavaScript中exec函数用法实例分析
2015/06/08 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
2015/10/26 Javascript
设置jquery UI 控件的大小方法
2016/12/12 Javascript
JS实现物体带缓冲的间歇运动效果示例
2016/12/22 Javascript
100多个基础常用JS函数和语法集合大全
2017/02/16 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
原生js调用json方法总结
2018/02/22 Javascript
详解webpack模块化管理和打包工具
2018/04/21 Javascript
vue项目中jsonp跨域获取qq音乐首页推荐问题
2018/05/30 Javascript
使用angular-cli webpack创建多个包的方法
2018/10/16 Javascript
写gulp遇到的ES6问题详解
2018/12/03 Javascript
微信小程序swiper使用网络图片不显示问题解决
2019/12/13 Javascript
JS co 函数库的含义和用法实例总结
2020/04/08 Javascript
python 中的列表解析和生成表达式
2011/03/10 Python
python针对不定分隔符切割提取字符串的方法
2018/10/26 Python
python定时复制远程文件夹中所有文件
2019/04/30 Python
详解Python传入参数的几种方法
2019/05/16 Python
python tkinter库实现气泡屏保和锁屏
2019/07/29 Python
Pytorch之Variable的用法
2019/12/31 Python
html5-Canvas可以在web中绘制各种图形
2012/12/26 HTML / CSS
域名注册、建站工具、网页主机、SSL证书:Dynadot
2017/01/06 全球购物
Farfetch香港官网:汇集全球时尚奢侈品购物平台
2017/11/26 全球购物
财务助理岗位职责
2013/11/10 职场文书
大学生旅游业创业计划书
2014/01/29 职场文书
城镇居民医疗保险工作总结
2015/08/10 职场文书
只用40行Python代码就能写出pdf转word小工具
2021/05/31 Python