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 相关文章推荐
source.php查看源文件
Dec 09 PHP
用php实现选择排序的解决方法
May 04 PHP
探讨PHP使用eAccelerator的API开发详解
Jun 09 PHP
探讨:php中在foreach中使用foreach ($arr as &amp;$value) 这种类型的解释
Jun 24 PHP
PHP中Fatal error session_start()错误解决步骤
Aug 05 PHP
php使用cookie实现记住登录状态
Apr 27 PHP
PHP获取文件行数的方法
Jun 10 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
Oct 21 PHP
PHP封装的PDO数据库操作类实例
Jun 21 PHP
PHP实现的堆排序算法详解
Aug 17 PHP
laravel如何开启跨域功能示例详解
Aug 31 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
Nov 16 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&amp;MYSQL分页原理及实现
2007/01/02 PHP
利用PHP+JS实现搜索自动提示(实例)
2013/06/09 PHP
朋友网关于QQ相关的PHP代码(研究QQ的绝佳资料)
2015/01/26 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
2017/03/19 PHP
LazyLoad 延迟加载(按需加载)
2010/05/31 Javascript
js自定义事件及事件交互原理概述(一)
2013/02/01 Javascript
jQuery中:password选择器用法实例
2015/01/03 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
两种js监听滚轮事件的实现方法
2016/05/13 Javascript
jQuery实现的无限级下拉菜单功能示例
2016/09/12 Javascript
js中this对象用法分析
2018/01/05 Javascript
vue项目打包部署到服务器的方法示例
2018/08/27 Javascript
微信小程序websocket实现即时聊天功能
2019/05/21 Javascript
vue+element实现表格新增、编辑、删除功能
2019/05/28 Javascript
[47:35]VP vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
详解在Python程序中使用Cookie的教程
2015/04/30 Python
Python简单读取json文件功能示例
2017/11/30 Python
Python定义二叉树及4种遍历方法实例详解
2018/07/05 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
Python字符串的一些操作方法总结
2019/06/10 Python
Django Rest framework权限的详细用法
2019/07/25 Python
CSS3实现超慢速移动动画效果非常流畅无卡顿
2014/06/15 HTML / CSS
顺丰快递Java软件工程师面试题
2015/07/31 面试题
医学专业毕业生个人的求职信
2013/12/04 职场文书
银行员工职业规划范文
2014/01/21 职场文书
股权转让协议书
2014/04/12 职场文书
本科生导师推荐信范文
2014/05/18 职场文书
环境保护与污染治理求职信
2014/07/16 职场文书
安全主题班会教案
2015/08/12 职场文书
会计入职心得体会
2016/01/22 职场文书
Python字符串对齐方法使用(ljust()、rjust()和center())
2021/04/26 Python
OpenCV-Python实现轮廓的特征值
2021/06/09 Python
浅谈什么是SpringBoot异常处理自动配置的原理
2021/06/21 Java/Android
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
2022/01/18 PostgreSQL
nginx设置资源请求目录的方式详解
2022/05/30 Servers
JS前端使用Canvas快速实现手势解锁特效
2022/09/23 Javascript