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的memcached客户端memcached
Jun 14 PHP
php代码书写习惯优化小结
Jun 20 PHP
php三维数组去重(示例代码)
Nov 26 PHP
PHP函数microtime()用法与说明
Dec 04 PHP
php递归删除目录下的文件但保留的实例分享
May 10 PHP
php函数serialize()与unserialize()用法实例
Nov 06 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
Nov 19 PHP
php提示Failed to write session data错误的解决方法
Dec 17 PHP
php查询mysql大量数据造成内存不足的解决方法
Mar 04 PHP
yii权限控制的方法(三种方法)
Dec 28 PHP
PHP5.5安装PHPRedis扩展及连接测试方法
Jan 22 PHP
PhpSpreadsheet设置单元格常用操作汇总
Nov 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 导出excle的.csv格式的数据时乱码问题
2017/02/18 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
2021/03/09 Javascript
js切换光标示例代码
2013/10/10 Javascript
jQuery取id有.的值的方法
2014/05/21 Javascript
javascript几个易错点记录
2014/11/26 Javascript
sails框架的学习指南
2014/12/22 Javascript
Javascript中的迭代、归并方法详解
2016/06/14 Javascript
jQuery如何获取动态添加的元素
2016/06/24 Javascript
js替换字符串中所有指定的字符(实现代码)
2016/08/17 Javascript
初探js和简单隐藏效果的实例
2017/11/23 Javascript
JS把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
2019/07/10 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
Python实例之wxpython中Frame使用方法
2014/06/09 Python
Python开发的HTTP库requests详解
2017/08/29 Python
pygame游戏之旅 游戏中添加显示文字
2018/11/20 Python
python如何把字符串类型list转换成list
2020/02/18 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
2020/05/20 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
2020/11/24 Python
利用html5 canvas动态画饼状图的示例代码
2018/04/02 HTML / CSS
Meli Melo官网:名媛们钟爱的英国奢侈手包品牌
2017/04/17 全球购物
美国睫毛、眉毛精华液领导品牌:RevitaLash Cosmetics
2018/03/26 全球购物
Infababy英国:婴儿推车、Travel System婴儿车和婴儿汽车座椅销售
2018/05/23 全球购物
馥绿德雅美国官方网站:Rene Furterer头皮护理专家
2019/05/01 全球购物
GC是什么?为什么要有GC?
2013/12/08 面试题
甲方资料员岗位职责
2013/12/13 职场文书
职务任命书范本
2014/06/05 职场文书
学校党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
员工离职证明范本
2015/06/12 职场文书
军训后的感想
2015/08/07 职场文书
为什么阅读对所有年龄段的孩子都很重要?
2019/07/08 职场文书
fastdfs+nginx集群搭建的实现
2021/03/31 Servers
如何使JavaScript休眠或等待
2021/04/27 Javascript
python pygame入门教程
2021/06/01 Python
Python中itertools库的四个函数介绍
2022/04/06 Python
Spring Cloud OpenFeign模版化客户端
2022/06/25 Java/Android