一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - PHP實現的簡單路由和類自動加載功能

PHP實現的簡單路由和類自動加載功能

2019-10-18 13:16程序分子 PHP教程

這篇文章主要介紹了PHP實現的簡單路由和類自動加載功能,結合實例形式分析了php路由及類自動加載的原理與相關實現技巧,需要的朋友可以參考下

本文實例講述了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程序設計有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产亚洲综合久久 | 女人是男人的未来1分49分 | 免费高清在线视频色yeye | julianann办公室 | 国产欧美视频在线观看 | 调教麻麻成贱m | 国产日韩欧美精品在线 | 无人区乱码区1卡2卡三卡在线 | 无码爽死成人777在线观看网站 | 精品国产一区二区三区久 | 调教小龙女 | 亚洲免费福利视频 | 天天摸天天爽视频69视频 | 日韩欧美中文字幕出 | 99热国产这里只有精品99 | 国产成人综合一区精品 | 欧美一级片免费看 | 亚洲 欧美 国产 视频二区 | 亚洲久操 | 青草园网站在线观看 | 国产成人yy精品1024在线 | 天天久久综合 | 毛片免费观看 | 麻豆夏晴子 | 蛮荒的童话未删减在线观看 | 国产一级大片免费看 | 国产真实一区二区三区 | 日韩免费毛片视频杨思敏 | 青青久久精品国产免费看 | 国产午夜精品一区二区 | 魔法满屋免费观看完整版中文 | 亚洲国产精品综合久久一线 | 天天有好逼 | 日本福利网 | 精品欧美一区二区在线观看欧美熟 | 国产欧美日韩在线不卡第一页 | 美女国内精品自产拍在线播放 | 精品国产精品国产偷麻豆 | 精品福利一区二区免费视频 | 好男人在线观看免费高清2019韩剧 | 经典三级四虎在线观看 |