Home  >  Article  >  Backend Development  >  PHP implements routing and class automatic loading

PHP implements routing and class automatic loading

php中世界最好的语言
php中世界最好的语言Original
2018-03-24 17:54:031621browse

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(); //

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;);

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);
  }
}

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);
  }
}

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;
  }
}

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!

Statement:
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