Maison >développement back-end >tutoriel php >Analyse du mécanisme de chargement automatique autoLoad de PHP
Cet article présente principalement l'analyse du mécanisme de chargement automatique autoLoad de PHP. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer
Il existe généralement deux façons d'utiliser PHP. Méthodes autoload : méthodes __autoload et spl. Ces deux méthodes ont des méthodes d'utilisation différentes
Comment utiliser __autoload 1 :
La méthode la plus couramment utilisée consiste à trouver la classe en fonction du fichier de nom de classe, puis require_one
function __autoload($class_name) { $path = str_replace('_', '/', $class_name); require_once $path . '.php'; } // 这里会自动加载Http/File/Interface.php 文件 $a = new Http_File_Interface();
L'avantage de cette méthode est qu'elle est simple et facile à utiliser. Bien sûr, il y a aussi des inconvénients. L'inconvénient est que le nom de la classe et le chemin du fichier doivent être convenus. Lorsque la structure du fichier est modifiée, le nom de la classe doit être modifié.
Comment utiliser __autoload 2 (méthode de mappage direct)
$map = array( 'Http_File_Interface' => 'C:/PHP/HTTP/FILE/Interface.php' ); function __autoload($class_name) { if (isset($map[$class_name])) { require_once $map[$class_name]; } } // 这里会自动加载C:/PHP/HTTP/FILE/Interface.php 文件 $a = new Http_File_Interface();
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 lorsque la structure du fichier change, vous n'avez pas besoin de modifier le nom de la classe, il vous suffit de modifier l'élément correspondant dans le mappage.
L'inconvénient de cette méthode par rapport à la méthode précédente est qu'il est très difficile de maintenir ce mappage lorsqu'il y a trop de fichiers. Peut-être qu'à ce moment-là, vous envisagerez d'utiliser json ou un fichier séparé pour la maintenance. Peut-être penseriez-vous à utiliser un framework pour maintenir ou créer une telle cartographie.
spl_autoload
Le plus gros défaut de __autoload est qu'il ne peut pas avoir plusieurs méthodes de chargement automatique
D'accord, pensez au scénario suivant. Votre projet fait référence à un projet de quelqu'un d'autre. Votre projet existe. un __autoload dans le projet, et les projets d'autres personnes ont également un __autoload, donc les deux __autoloads sont en conflit. La solution est de modifier __autoload pour en faire un, ce qui est sans doute très fastidieux.
Par conséquent, nous devons de toute urgence utiliser une pile d'appels à chargement automatique, afin que les fonctions de série de chargement automatique de spl apparaissent. Vous pouvez utiliser spl_autoload_register pour enregistrer plusieurs fonctions de chargement automatique personnalisées
Si votre version de PHP est supérieure à 5.1, vous pouvez utiliser spl_autoload
Comprenez d'abord plusieurs fonctions de spl :
spl_autoload est l'implémentation par défaut de _autoload(), il recherchera $class_name(.php/.inc) dans include_path
Spl_autoload implémente le chargement automatique :
/*http.php*/ <?php class http { public function callname(){ echo "this is http"; } } /*test.php*/ <?php set_include_path("/home/yejianfeng/handcode/"); //这里需要将路径放入include spl_autoload("http"); //寻找/home/yejianfeng/handcode/http.php $a = new http(); $a->callname();
Spl_autoload_register
Enregistrez la fonction dans la pile de fonctions SPL __autoload, regardez directement un exemple :
/*http.php*/ <?php class http { public function callname(){ echo "this is http"; } } /*test.php*/ <?php spl_autoload_register(function($class){ if($class == 'http'){ require_once("/home/yejianfeng/handcode/http.php"); } }); $a = new http(); $a->callname(); spl_autoload_call
Appelez la fonction appelante enregistrée dans spl_autoload_register, regardez l'exemple suivant
/*http.php*/ <?php class http { public function callname(){ echo "this is http"; } } /*http2.php*/ <?php class http { public function callname(){ echo "this is http2"; } } /*test.php*/ <?php spl_autoload_register(function($class){ if($class == 'http'){ require_once("/home/yejianfeng/handcode/http.php"); } if($class == 'http2'){ require_once("/home/yejianfeng/handcode/http2.php"); } }); spl_auto_call('http2'); $a = new http(); $a->callname(); //这个时候会输出"this is http2"
spl_auto_register Cette fonction nous permet de faire n'utilisez pas __autoload, il est possible d'utiliser une fonction personnalisée pour le chargement automatique. Cette méthode est désormais couramment utilisée.
Le module AutoLoader de Zend utilise cette méthode. Extrait du code correspondant
spl_autoload_register(array(__CLASS__, 'autoload')); public static function autoload($class) { ….. }
Ce qui précède est l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !
Recommandations associées :
en php Utilisez html_entity_decode pour implémenter l'échappement d'entité HTML
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!