Maison  >  Article  >  développement back-end  >  Explication détaillée des étapes pour implémenter le routage et le chargement automatique des classes en PHP

Explication détaillée des étapes pour implémenter le routage et le chargement automatique des classes en PHP

php中世界最好的语言
php中世界最好的语言original
2018-05-18 11:19:321534parcourir

Cette fois, je vais vous apporter une explication détaillée des étapes pour implémenter le routage et le chargement automatique des classes en PHP Quelles sont les précautions et les cas suivants sont des cas pratiques. jetez un oeil.

Le répertoire du projet est le suivant

Fichier d'entréeindex.php

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

Classe chargement automatique du fichier environnement.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;);

Les règles de chargement de mes classes ici sont, par exemple, coreapp::run() correspondant à la méthode run() dans le répertoire racine/core/app.php La fonction spl_autoload_register() est utilisée pour implémenter le chargement automatique When. un certain nom de classe est appelé, il sera automatiquement exécutéspl_autoload_register(&#39;loader::load&#39;), incluez le fichier de classe correspondant en fonction du nom de classe.

La méthode d'exécution du fichier d'entrée app.php démarre l'exécution du processus framework

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

Trouvez le contrôleur correspondant en fonction de l'URI de la requête et utilisez la méthode call_user_func_array() pour appeler le méthode dans le contrôleur

Répertoire racine/controller/test.php

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

En fait, l'appel ici ne doit pas nécessairement appeler la méthode de test dans le modèle. Vous pouvez appeler n'importe laquelle. fichier dans le répertoire modèle Vous pouvez en lire avant cela.

Répertoire racine/model/test.php

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

Par exemple, la requête hostname/test/write proviendra du fichier d'entrée. Après coreapp::run, vous trouverez le. correspondant sous la classe controller.controllertest, exécutez la méthode write()

Je pense que vous maîtrisez la méthode après avoir lu le cas dans cet article. Pour des informations plus intéressantes, veuillez prêter attention aux autres articles connexes sur le. Site Web chinois PHP !

Lecture recommandée :

Mise en œuvre du framework Laravel pour l'analyse du code de la fonction de recherche

Explication détaillée des étapes pour générer des affiches de promotion en PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn