Maison  >  Article  >  développement back-end  >  Explication détaillée d'exemples de mécanisme de chargement automatique de classe PHP

Explication détaillée d'exemples de mécanisme de chargement automatique de classe PHP

伊谢尔伦
伊谢尔伦original
2017-07-01 09:18:551297parcourir

Mécanisme de chargement automatique de classede PHP Une classe utilise généralement les méthodes include et require pour inclure le fichier qui définit la classe. Lorsque cela est développé à petite échelle, il n’y a pas de gros problème. Cependant, dans les projets de développement à grande échelle, cela générera un grand nombre d'appels de méthode require ou include, ce qui non seulement réduit l'efficacité, mais rend également le code difficile à maintenir. De plus,
require_once
est très coûteux. .

Avant PHP5, si chaque framework PHP voulait implémenter le chargement automatique de classes, il implémentait généralement un parcours de répertoires

selon un certain accord, et automatiquement Une classe ou une fonction qui charge tous les fichiers qui correspondent aux règles convenues. Bien entendu, le support orienté objet avant PHP5 n'était pas très bon et l'utilisation de classes n'était pas aussi fréquente qu'aujourd'hui. Après PHP5, lors du chargement d'une classe PHP, si le fichier où se trouve la classe n'est pas inclus, ou si le nom de la classe est erroné, le moteur Zend appellera automatiquement la fonction de chargement automatique. Cette fonction nécessite que les utilisateurs implémentent eux-mêmes la fonction de chargement automatique. Après PHP5.1.2, vous pouvez utiliser la fonction spl_autoload_register pour personnaliser la fonction de traitement de chargement automatique. Lorsque cette fonction n'est pas appelée, la fonction spl_autoload personnalisée de SPL sera utilisée par défaut.

1. Exemple de chargement automatique : Le code ci-dessus affichera à la fin : classe de chargement automatique : Démo.

Et après cela, une erreur est signalée : Erreur fatale : Classe 'Demo' introuvable

Nous utilisons généralement _autoload
function autoload($class_name) {
   echo &#39;autload class:&#39;, $class_name, &#39;<br />&#39;;
}

new Demo();
pour charger automatiquement les classes

comme suit :

Nous pouvons voir que _autoload doit faire au moins trois choses. La première chose est de déterminer le nom du fichier de classe en fonction du nom de la classe. La deuxième chose est de déterminer le chemin du disque où se trouve le fichier de classe (dans notre fichier. exemple, dans le cas le plus simple, la classe Dans le même dossier que les fichiers du programme PHP qui les appellent), la troisième chose est de charger les classes dans le système à partir du fichier disque. La troisième étape est la plus simple, utilisez simplement include/require. Pour réaliser les fonctions des première et deuxième étapes, la méthode de mappage entre le nom de classe et le fichier disque doit être convenue lors du développement. Ce n'est qu'ainsi que nous pourrons trouver son fichier disque correspondant en fonction du nom de classe. Par conséquent, lorsqu'il y a un grand nombre de fichiers de classe à inclure, il suffit de déterminer les règles correspondantes, puis dans la fonction autoload(), de faire correspondre le nom de la classe avec le fichier disque réel pour obtenir effet de chargement paresseux. De là, nous pouvons également voir que la chose la plus importante dans l'implémentation de la fonction autoload() est l'implémentation des règles de mappage entre le nom de la classe et le fichier disque réel.

<?php 

  function autoload($class_name) { 
       require_once ($class_name . “class.php”); 
  } 
   $memo= new Demo();  
Mais maintenant vient le problème. Si dans l'implémentation d'un système, si de nombreuses autres bibliothèques de classes doivent être utilisées, ces bibliothèques de classes peuvent être développées par différents ingénieurs de développement, et leurs noms de classe sont différents des noms de classe réels. les fichiers de disque. Les règles de mappage varient. À l'heure actuelle, si vous souhaitez implémenter le chargement automatique des fichiers de bibliothèque de classes, vous devez implémenter toutes les règles de mappage dans la fonction autoload(). Par conséquent, la fonction autoload() peut être très compliquée, voire impossible à implémenter. En fin de compte, la fonction autoload() peut devenir très lourde. Même si elle peut être implémentée, elle aura un impact négatif important sur la maintenance future et l'efficacité du système. Dans ce cas,

a introduit la bibliothèque standard SPL en PHP5,

une nouvelle solution, la fonction spl_autoload_register().

2. Fonction spl_autoload_register() La fonction de cette fonction est d'enregistrer la fonction dans la pile de fonctions de chargement automatique SPL et de supprimer le chargement automatique par défaut du système ( )fonction. Cela peut être vu dans l'exemple suivant :

function autoload($class_name) {
    echo &#39;autload class:&#39;, $class_name, &#39;<br />&#39;;
}
function classLoader($class_name) {
    echo &#39;SPL load class:&#39;, $class_name, &#39;<br />&#39;;
}
spl_autoload_register(&#39;classLoader&#39;);
new Test();//结果:SPL load class:Test

语法:bool  spl_autoload_register ( [callback $autoload_function] )    接受两个参数:一个是添加到自动加载栈的函数,另外一个是加载器不能找到这个类时是否抛出异常的标志。第一个参数是可选的,并且默认指向spl_autoload()函数,这个函数会自动在路径中查找具有小写类名和.php扩展或者.ini扩展名,或者任何注册到spl_autoload_extensions()函数中的其它扩展名的文件。

<?php  
class CalssLoader   
{   
    public static function loader($classname)   
    {   
        $class_file = strtolower($classname).".php";   
        if (file_exists($class_file)){   
            require_once($class_file);   
        }   
    }   
}    
// 方法为静态方法   
spl_autoload_register(&#39;CalssLoader::loader&#39;);    
$test = new Test();

      一旦调用spl_autoload_register()函数,当调用未定义类时,系统会按顺序调用注册到spl_autoload_register()函数的所有函数,而不是自动调用autoload()函数。如果要避免这种情况,需采用一种更加安全的spl_autoload_register()函数的初始化调用方法:

if(false === spl_autoload_functions()){    
    if(function_exists(&#39;autoload&#39;)){    
        spl_autoload_registe(&#39;autoload&#39;,false);    
    }    
 }

spl_autoload_functions()函数会返回已注册函数的一个数组,如果SPL自动加载栈还没有被初始化,它会返回布尔值false。然后,检查是否有一个名为autoload()的函数存在,如果存在,可以将它注册为自动加载栈中的第一个函数,从而保留它的功能。之后,可以继续注册自动加载函数。

还可以调用spl_autoload_register()函数以注册一个回调函数,而不是为函数提供一个字符串名称。如提供一个如array('class','method')这样的数组,使得可以使用某个对象的方法。

下一步,通过调用spl_autoload_call('className')函数,可以手动调用加载器,而不用尝试去使用那个类。这个函数可以和函数class_exists('className',false)组合在一起使用以尝试去加载一个类,并且在所有的自动加载器都不能找到那个类的情况下失败。

f(spl_autoload_call(&#39;className&#39;) && class_exists(&#39;className&#39;,false)){    
  
    } else {    
    }

SPL自动加载功能是由spl_autoload() ,spl_autoload_register(), spl_autoload_functions() ,spl_autoload_extensions()和spl_autoload_call()函数提供的。


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