PHP implements routing and class automatic loading

php中世界最好的语言
Release: 2023-03-22 09:22:02
Original
1669 people have browsed it

This time I will bring you PHP routing and class automatic loading, what are the notes for PHP routing and class automatic loading, the following is a practical case, let’s take a look one time.

The project directory is as follows

Entry fileindex.php

<?php
define(&#39;WEBROOT&#39;, &#39;C:/Users/Administrator/Documents/NetBeansProjects/test&#39;);
require_once(WEBROOT.&#39;/core/environment.php&#39;);
coreapp::run(); //
Copy after login

The class automatically loads the file 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 = &#39;.php&#39;) {
    if (!$ext) {
      $ext = &#39;.php&#39;;
    }
    $file = str_replace(&#39;&#39;, &#39;/&#39;, $name) . $ext; //类名转路径
    $path .= WEBROOT . &#39;/&#39; . $file;
    if (file_exists($path)) {
      return $path; //找到就返回
    }
    return null;
  }
}
spl_autoload_register(&#39;loader::load&#39;);
Copy after login

My class here The loading rule is, for example, coreapp::run() The run() method corresponding to the root directory/core/app.php uses the spl_autoload_register() function To implement automatic loading, when a certain class name is called, spl_autoload_register('loader::load') will be automatically executed to include the corresponding class file according to the class name.

The method of executing the app.php entry file starts running the framework process

<?php
class coreapp {
  static function run() {
    $a = $_SERVER[&#39;REQUEST_URI&#39;];
    $uri = rtrim(preg_replace(&#39;/\?.*/&#39;, &#39;&#39;, $_SERVER[&#39;REQUEST_URI&#39;]), &#39;/&#39;);
    $params = explode(&#39;/&#39;, trim($uri, &#39;/&#39;));
    $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);
  }
}
Copy after login

Find the corresponding controller according to the request uri, and use call_user_func_array() to call the controller Method

Root directory/controller/test.php

<?php
class controllertest {
  public function write($controller, $method) {
    //configtest::load('test');
    modeltest::write($controller, $method);
  }
}
Copy after login

In fact, the call here does not necessarily have to call the test method in the model. You can call any file in the model directory. Before that, you can go to Read some config files and other operations.

Root directory/model/test.php

<?php
class modeltest {
  public function write($model, $method) {
    echo 'From controller:'.$model.' to model: ' . $model . ' ,method: ' . $method;
  }
}
Copy after login

For example, the request hostname/test/write will come in from the entry file and will be found after coreapp::run The corresponding controllertest class under the controller executes the write()method

I believe you have mastered the method after reading the case in this article. For more exciting information, please pay attention to other related articles on the PHP Chinese website!

Recommended reading:

Detailed explanation of php retaining key values ​​+ merging arrays

Installing Apache and PHP environment in Alibaba Cloud

thinkphp method to generate url according to routing rules

The above is the detailed content of PHP implements routing and class automatic loading. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template