Maison  >  Article  >  développement back-end  >  Étude approfondie du mécanisme de chargement automatique de PHP

Étude approfondie du mécanisme de chargement automatique de PHP

伊谢尔伦
伊谢尔伦original
2017-07-01 09:59:411979parcourir

Cet article est une analyse détaillée et une introduction au mécanisme de chargement automatique PHP. Les amis qui en ont besoin peuvent se référer à

1. Chargement automatique dans la méthode PHP.
1. Utilisez require, include, require_once, include_once pour charger manuellement.
2. Utilisez autoload pour le chargement automatique
3. Utilisez l'autoload de spl pour le chargement automatique
Implémentation du chargement manuel :

Nous pouvons l'utiliser lorsqu'il y a peu de fichiers à charger. premier à finir. C'est facile et sans problème de le faire.

Le code est le suivant :

require_once 'a.php';
require_once 'b.php';
require_once 'c.php';


Mais est-ce toujours possible quand il y a beaucoup de fichiers à charger ? Que devons-nous faire lorsque nous devons écrire dix, vingt require_once ou plus ?

Pour le moment, nous pouvons utiliser la méthode de chargement automatique pour simplifier notre code.

Implémentation du chargement automatique :
Nous créons un fichier in.php dans le répertoire test avec le contenu suivant.

Le code est le suivant :

echo &#39;我是test下面的in.php<br />&#39;;

Créez ensuite un loader.php dans le répertoire test avec le contenu suivant.

Le code est le suivant :

// 需要重载autoload方法,自定义包含类文件的路径  
function autoload($classname)  
{  
 $class_file = strtolower($classname).".php";  
 if (file_exists($class_file)){  
  require_once($class_file);  
 }  
}
@$test = new in(); // 执行到这里会输出 <SPAN style="FONT-FAMILY: Arial, Helvetica, sans-serif">我是test下面的in.php</SPAN>


Pas de problème, ça a fonctionné ! Nous pouvons également créer d'autres fichiers à charger, mais que devons-nous faire lorsqu'il y a de nombreux fichiers qui doivent être divisés en répertoires ?

À ce stade, nous devons modifier loader.php pour utiliser le mappage afin de trouver le fichier à charger.

Le code est le suivant :

function autoload($class_name) {
 $map = array(
  &#39;index&#39; => &#39;./include/index.php&#39;,
  &#39;in&#39; => &#39;./in.php&#39;
 );
    if (file_exists($map[$class_name]) && isset($map[$class_name])) {
        require_once $map[$class_name];
    }
}
new index();


L'avantage de cette méthode est que le nom de la classe et le chemin du fichier ne sont conservés qu'avec un mappage, donc lorsque le la structure du fichier change, non Si vous devez modifier le nom de la classe, il vous suffit de modifier l'élément correspondant dans le mappage.

Mais le chargement automatique ne peut être utilisé qu'une seule fois dans un projet. Lorsque votre projet fait référence à un projet de quelqu'un d'autre, il y a un chargement automatique dans votre projet et il y a un chargement automatique dans le projet de quelqu'un d'autre, donc les deux chargements automatiques sont en conflit. La solution est de modifier le chargement automatique pour en faire un. C'est sans aucun doute très fastidieux et n'a qu'un seul scénario d'application.

Implémentation du chargement automatique de SPL :
La série de fonctions de chargement automatique de SPL utilise une pile d'appels de chargement automatique Vous pouvez utiliser spl_autoload_register pour enregistrer plusieurs fonctions de chargement automatique personnalisées, à l'échelle. gamme de scénarios d'application

• Créer in.php dans le répertoire de test, avec le contenu suivant

Le code est le suivant :

<?php
class in {
 public function index() {
  echo &#39;我是test下面的in.php&#39;;
 }
}
?>


Créez loader.php dans le répertoire test avec le contenu suivant

Le code est le suivant :

<?php
set_include_path("/var/www/test/"); //这里需要将路径放入include
spl_autoload("in"); //寻找/var/www/test/in.php
$in = new in();
$in->index();


•spl_autoload_register fonctionnera Register dans la pile de fonctions de chargement automatique SPL, modifiez le code loader.php

comme suit :

function AutoLoad($class){
    if($class == &#39;in&#39;){
        require_once("/var/www/test/in.php");
    }
}
spl_autoload_register(&#39;AutoLoad&#39;);
$a = new in();
$a->index();


•spl_autoload_register enregistre plusieurs applications de fonction de chargement automatique personnalisées
Créez d'abord le dossier mods dans le répertoire de test et créez inmod.mod.php avec le contenu suivant :

Le code est le suivant :

<?php
class inmod
{
 function construct()
 {
  echo &#39;我是mods下的in&#39;;
 }
}


Créez-le ensuite dans le dossier libs du répertoire de test et créez inlib.lib.php avec le contenu suivant :

Le code est le suivant :

<?php
class inlib
{
 function construct()
 {
  echo &#39;我是libs下的in&#39;;
 }
}


Enfin, créez loader.php dans le répertoire test avec le contenu suivant

Le code est le suivant :

<?php
class Loader {
    /**
    * 
自动加载类
    * @param $class 类名
    */
    public static function mods($class) {
        if($class){
   set_include_path( "/var/www/test/mods/" );
   spl_autoload_extensions( ".mod.php" );
   spl_autoload( strtolower($class) );
        }
    }
    public static function libs($class) {
  if($class){
   set_include_path( "/var/www/test/libs/" );
   spl_autoload_extensions( ".lib.php" );
   spl_autoload( strtolower($class) );
        }
    }
}
spl_autoload_register(array(&#39;Loader&#39;, &#39;mods&#39;));
spl_autoload_register(array(&#39;Loader&#39;, &#39;libs&#39;));
new inmod();//输出<SPAN style="FONT-FAMILY: &#39;Times New Roman&#39;; FONT-SIZE: 14px">我是mods下的in</SPAN>
new inlib();//<SPAN style="FONT-FAMILY: Arial, Helvetica, sans-serif">输出</SPAN><SPAN style="FONT-FAMILY: &#39;Times New Roman&#39;; FONT-SIZE: 14px">我是libs下的in</SPAN>

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