Maison >développement back-end >tutoriel php >Analyse du mécanisme de chargement automatique autoLoad de PHP

Analyse du mécanisme de chargement automatique autoLoad de PHP

不言
不言original
2018-06-13 10:23:421424parcourir

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 :
Analyse du mécanisme de chargement automatique autoLoad de PHP

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 == &#39;http&#39;){ 
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 == &#39;http&#39;){ 
require_once("/home/yejianfeng/handcode/http.php"); 
} 
if($class == &#39;http2&#39;){ 
require_once("/home/yejianfeng/handcode/http2.php"); 
} 
}); 
spl_auto_call(&#39;http2&#39;); 
$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__, &#39;autoload&#39;)); 

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 :

Comment résoudre le problème de conversion des horodatages et des dates Unix en PHP basé sur la classe DateTime

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!

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