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获取网络文件的实现代码
Jan 01 PHP
PHP开发中四种查询返回结果分析
Jan 02 PHP
phpcms模块开发之swfupload的使用介绍
Apr 28 PHP
codeigniter中实现一次性加载多个view的方法
Mar 20 PHP
PHP实现生成唯一会员卡号
Aug 24 PHP
php session的锁和并发
Jan 22 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
Jun 13 PHP
PHP文件下载实例代码浅析
Aug 17 PHP
laravel migrate初学常见错误的解决方法
Oct 11 PHP
Laravel中unique和exists验证规则的优化详解
Jan 28 PHP
Laravel用户授权系统的使用方法示例
Sep 16 PHP
php实现记事本案例
Oct 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
ajax缓存问题解决途径
2006/12/06 PHP
PHP几个数学计算的内部函数学习整理
2011/08/06 PHP
php实现与erlang的二进制通讯实例解析
2014/07/23 PHP
Symfony数据校验方法实例分析
2015/01/26 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
2009/02/14 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
JavaScript中的闭包(Closure)详细介绍
2014/12/30 Javascript
jQuery拖动元素并对元素进行重新排序
2015/12/30 Javascript
AngularJS bootstrap启动详解及实例代码
2016/09/14 Javascript
nodejs 使用nodejs-websocket模块实现点对点实时通讯
2018/11/28 NodeJs
详解Vue中的Props与Data细微差别
2020/03/02 Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
2020/07/26 Javascript
vue项目打包后请求地址错误/打包后跨域操作
2020/11/04 Javascript
[05:13]TI4 中国战队 机场出征!!
2014/07/07 DOTA
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
python中PIL安装简单教程
2016/04/21 Python
浅析Python中元祖、列表和字典的区别
2016/08/17 Python
Python机器学习logistic回归代码解析
2018/01/17 Python
对pandas中to_dict的用法详解
2018/06/05 Python
python入门:这篇文章带你直接学会python
2018/09/14 Python
Python 通过打码平台实现验证码的实现
2019/05/13 Python
从列表或字典创建Pandas的DataFrame对象的方法
2019/07/06 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
受希腊女神灵感的晚礼服、鸡尾酒礼服和婚纱:THEIA
2018/04/15 全球购物
UGG澳洲官网:UGG Australia
2018/04/26 全球购物
电脑饰品店的创业计划书
2014/01/21 职场文书
建筑公司员工自我鉴定
2014/04/08 职场文书
学习之星事迹材料
2014/05/17 职场文书
安全标兵事迹材料
2014/08/17 职场文书
《包身工》教学反思
2016/02/23 职场文书
Python基础之pandas数据合并
2021/04/27 Python
python井字棋游戏实现人机对战
2022/04/28 Python
PYTHON 使用 Pandas 删除某列指定值所在的行
2022/04/28 Python