• 售前

  • 售后

热门帖子
入门百科

PHP实现的简单路由和类自动加载功能

[复制链接]
王建新1 显示全部楼层 发表于 2021-10-25 19:01:14 |阅读模式 打印 上一主题 下一主题
本文实例陈诉了PHP实现的简单路由和类自动加载功能。分享给大家供大家参考,具体如下:
项目目录如下
入口文件index.php
  1. <?php
  2. define('WEBROOT', 'C:/Users/Administrator/Documents/NetBeansProjects/test');
  3. require_once(WEBROOT.'/core/environment.php');
  4. core__app::run(); //
复制代码
类自动加载文件environment.php
  1. <?php
  2. //根据类名来include文件
  3. class loader {
  4.   //找到对应文件就include
  5.   static function load($name) {
  6.     $file = self::filepath($name);
  7.     if ($file) {
  8.       return include $file;
  9.     }
  10.   }
  11.   static function filepath($name, $ext = '.php') {
  12.     if (!$ext) {
  13.       $ext = '.php';
  14.     }
  15.     $file = str_replace('__', '/', $name) . $ext; //类名转路径
  16.     $path .= WEBROOT . '/' . $file;
  17.     if (file_exists($path)) {
  18.       return $path; //找到就返回
  19.     }
  20.     return null;
  21.   }
  22. }
  23. spl_autoload_register('loader::load');
复制代码
我这里类的加载规则是 好比
  1. core__app::run()
复制代码
对应 根目录/core/app.php 的
  1. run()
复制代码
方法,用到了
  1. spl_autoload_register()
复制代码
函数实现自动加载,当调用某个类名的时间,会自动执行
  1. spl_autoload_register('loader::load')
复制代码
,根据类名include对应的类文件。
app.php入口文件执行的方法开始跑框架流程
  1. <?php
  2. class core__app {
  3.   static function run() {
  4.     $a = $_SERVER['REQUEST_URI'];
  5.     $uri = rtrim(preg_replace('/\?.*/', '', $_SERVER['REQUEST_URI']), '/');
  6.     $params = explode('/', trim($uri, '/'));
  7.     $count = count($params);
  8.     if ($count > 1) {
  9.       $controller = $params[0];
  10.       $method = $params[1];
  11.     } elseif ($count == 1) {
  12.       $controller = 'index';
  13.       $method = $params[0];
  14.     } else {
  15.     }
  16.     $filename = WEBROOT . '/controller/' . $controller . '.php';
  17.     $controller = 'controller__'.$controller;
  18.     try {
  19.       if (!file_exists($filename)) {
  20.         throw new Exception('controller ' . $controller . ' is not exists!');
  21.         return;
  22.       }
  23.       include($filename);
  24.       if (!class_exists($controller)) {
  25.         throw new Exception('class ' . $controller . ' is not exists');
  26.         return;
  27.       }
  28.       $obj = new ReflectionClass($controller);
  29.       if (!$obj->hasMethod($method)) {
  30.         throw new Exception('method ' . $method . ' is not exists');
  31.         return;
  32.       }
  33.     } catch (Exception $e) {
  34.       echo $e; //展示错误结果
  35.       return;
  36.     }
  37.     $newObj = new $controller();
  38.     call_user_func_array(array($newObj, $method), $params);
  39.   }
  40. }
复制代码
根据哀求uri去找对应的controller, 用
  1. call_user_func_array()
复制代码
的方式调用controller里的方法
根目录/controller/test.php
  1. <?php
  2. class controller__test {
  3.   public function write($controller, $method) {
  4.     //config__test::load('test');
  5.     model__test::write($controller, $method);
  6.   }
  7. }
复制代码
这里实在调用不肯定要调用model里的test方法,可以调model目录下的恣意文件,在此之前可以去都读一些config文件等等操纵。
根目录/model/test.php
  1. <?php
  2. class model__test {
  3.   public function write($model, $method) {
  4.     echo 'From controller:'.$model.' to model: ' . $model . ' ,method: ' . $method;
  5.   }
  6. }
复制代码
例如hostname/test/write 这个哀求就会从入口文件进来,颠末
  1. core__app::run
复制代码
就会找到controller下对应的的controller__test类,执行
  1. write()
复制代码
方法
更多关于PHP相干内容感爱好的读者可查看本站专题:《php面向对象程序筹划入门教程》、《PHP数组(Array)操纵本领大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操纵入门教程》及《php常见数据库操纵本领汇总》
希望本文所述对大家PHP程序筹划有所资助。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作