Maison  >  Article  >  développement back-end  >  Exemples détaillés de 3 façons de charger automatiquement des classes PHP

Exemples détaillés de 3 façons de charger automatiquement des classes PHP

伊谢尔伦
伊谢尔伦original
2017-07-01 10:26:492250parcourir

J'ai récemment appris à composer et j'ai découvert trois façons de charger automatiquement les classes en PHP depuis que je suis entré en contact avec PHP. Celles-ci incluent la méthode de chargement automatique des propres classes de PHP, la troisième méthode de chargement de PHP. de composer, un outil de gestion des dépendances tiers et la méthode de chargement automatique sous le framework Yaf de PHP. Ce blog présente principalement en détail la méthode de chargement fournie avec PHP5. Le chargement automatique des classes sous composer et Yaf sera divisé en deux parties à apprendre avec vous la prochaine fois.

1. Méthode de chargement manuel

Dans des langages tels que C et C++, lorsque vous devez utiliser des classes et des méthodes associées dans un autre fichier en PHP, vous pouvez utiliser include,

include_once, require ou require_once pour inclure les fichiers utilisés dans le projet. Parmi eux, les différences entre les quatre sont les suivantes.

  • include appliquera un fichier si le fichier n'existe pas, une invite sera donnée et l'exécution sera ignorée

  • include_once. appliquera également un fichier, mais il ne sera appliqué qu'une seule fois. Si le fichier n'existe pas, l'exécution continuera

  • require signifie appliquer un fichier. existe, l'exécution du programme sera interrompue ;

  • require_once s'applique également à un fichier, et ne sera appliqué qu'une seule fois. Si le fichier n'existe pas, l'exécution du programme sera. interrompu;

Quelles sont les quatre méthodes ci-dessus requises lors de la création d'un fichier, incluez manuellement le fichier dans le programme. Cela est acceptable lorsque la taille du projet est relativement petite ; mais à mesure que la taille du projet augmente, charger manuellement les classes requises pour chaque fichier devient tout simplement un cauchemar.

Pour éviter les problèmes, vous pouvez définir le chemin de chargement via

set_include_path() lors du chargement, et vous pouvez également obtenir le chemin de chargement via get_include_path(). Concernant set_include_path() et get_include_path(), je viens d'entrer en contact avec eux. Ici, je ne donnerai qu'une brève introduction à set_include_path(), et j'en ajouterai d'autres lorsque je rencontrerai des problèmes à l'avenir.

Tout d'abord, set_include_path() modifie dynamiquement le include_path dans php.ini dans le script, et ce include_path est la combinaison de include et require (si aucune explication particulière n'est donnée ci-dessous, include signifie include et include_once, require représente le chemin de require et require_once) à définir ou à prédéfinir. Si nous devons utiliser a.php, b.php, c.php... dans le dossier projname/home/lib/mylib/test d'un fichier main.php, si le chemin inclus n'est pas défini, écrivez-le dans la forme suivante :

<?php

        include("projname/home/lib/mylib/test/a.php");
        include("projname/home/lib/mylib/test/b.php");
        include("projname/home/lib/mylib/test/c.php");
	  ......
De cette façon, chaque inclusion doit contenir un chemin absolu, ce qui semble très gênant. Si vous ajoutez set_include_path("projname/home/lib/mylib/test") avant le fichier qui doit être inclus, alors il peut être écrit sous la forme suivante :

<?php

    set_include_path("projname/home/lib/mylib/test");
    include("a.php");
    include("b.php");
    include("c.php");
    ......
Par rapport à la première méthode La deuxième façon d'écrire est longue et laborieuse. Elle permet évidemment de gagner beaucoup de temps, mais elle doit quand même inclure chaque fichier. Elle simplifie simplement le chemin d'inclusion. Bien entendu, la situation mentionnée ci-dessus est que les fichiers requis existent tous dans un seul dossier. Si les fichiers existent dans différents dossiers, vous pouvez ajouter plusieurs instructions set_include_path() à ce stade, si les fichiers incluent ou nécessitent le fichier inclus. le nom apparaît dans plusieurs répertoires, seul le fichier qui apparaît en premier dans le répertoire set_include_path sera inclus ; s'il n'y a pas de fichiers correspondants dans tous les dossiers spécifiés par set_include_path, et que le nom du fichier apparaît dans le dossier actuel, il inclut directement le fichiers correspondants dans le répertoire courant.

La fonction get_include_path() ne convient que pour obtenir le chemin d'inclusion actuel.

2._autoload et spl_autoload_register() méthodes de chargement automatique

Afin de vous libérer des mains de la méthode de chargement de classe, un mécanisme de chargement automatique est fourni dans PHP5 et les versions ultérieures -- -autoload. Le chargement automatique permet aux classes d'être chargées uniquement lorsqu'elles sont réellement nécessaires, ce qu'on appelle le chargement paresseux, au lieu d'inclure ou d'exiger tous les fichiers de classe depuis le début. Le mécanisme de chargement automatique fourni par PHP est divisé en deux types : autoload() et spl_autoload_register().

 1). Mécanisme de chargement automatique

Pendant le processus d'exécution du programme en PHP5, s'il s'avère qu'une certaine classe n'est pas incluse, alors le mécanisme de chargement automatique sera exécuté pour ajouter le requis La classe est chargée. Il s'écrit ainsi :

<?php

	public function  autoload($classname) {
		$fileName = $classname."php";
		if (file_exist($fileName)) {
			require_once("$fileName");
		} else {
			echo $fileName." doesn&#39;t exist!"
		}
	}
D'après la manière dont ce programme est écrit, on peut tirer la conclusion suivante :

Le principe pour assurer le mécanisme de chargement automatique est de faire en sorte que le nom de la classe et le nom de fichier ont une relation correspondante, Le nom de classe + suffixe constitue le nom du fichier dans lequel se trouve cette classe. Si le fichier existe, la classe est chargée en fonction de $fileName. Si le fichier n'existe pas, l'utilisateur est informé que le fichier n'existe pas. En général, le mécanisme de chargement automatique comprend trois étapes :

  • Déterminer le nom du fichier en fonction du nom de la classe, c'est-à-dire déterminer une règle de correspondance unifiée entre le nom de la classe et le nom du fichier ;

  • Rechercher le fichier correspondant sur le disque en fonction du nom du fichier (l'exemple est le cas le plus simple, c'est-à-dire que la classe et le fichier PHP qui les appelle sont dans le même répertoire s'ils) ; ne sont pas dans le même répertoire, vous pouvez alors utiliser set_include_path() pour spécifier le chemin à charger

  • pour charger le fichier disque dans le système de fichiers. general include et nécessite d'inclure le fichier de classe correspondant ;

Le principe de autoload() pour implémenter le chargement automatique des classes est le suivant : il existe une correspondance unifiée entre les noms de classe et les noms de fichiers, ce qui est la clé pour implémenter le chargement automatique dans un système. Cependant, un système peut être développé par différentes personnes. S'il n'y a pas de norme unifiée convenue avant le développement, il peut y avoir différentes règles correspondantes, ce qui peut conduire à la nécessité d'implémenter plusieurs règles de chargement dans autoload(), ce qui peut entraîner un autoload( ) fonction à Très gonflé. Afin de résoudre ce problème, PHP fournit également un mécanisme de chargement automatique --- spl_autoload_register().

 2). Mécanisme spl_autoload_register()

SPL est la bibliothèque PHP standard. L'abréviation de est une bibliothèque d'extensions introduite dans PHP5. Le chargement automatique SPL est implémenté en pointant le pointeur de fonction autoload_func vers la fonction de chargement automatique. SPL a deux fonctions de chargement automatique différentes, à savoir spl_autoload et spl_autoload_call. Différents mécanismes de chargement automatique peuvent être implémentés en pointant autoload_fun vers les adresses de ces deux fonctions de chargement différentes.

  • spl_autoload

spl_autoload est la fonction de chargement automatique par défaut implémentée par SPL. C'est une fonction qui peut accepter deux paramètres. La première fonction est $class_name, qui représente le nom de la classe à charger ; le deuxième paramètre est $file_extension, qui est un paramètre facultatif et représente l'extension du fichier de classe. Plusieurs extensions peuvent être spécifiées dans $file_extension. Les extensions peuvent être séparées par des points-virgules. Si aucune extension n'est spécifiée, l'extension par défaut .inc ou .php sera utilisée. spl_autoload change d'abord $class_name en minuscules, puis recherche les fichiers $class_name.inc ou $class_name.php dans tous les include_paths. Si le fichier correspondant est trouvé, la classe correspondante est chargée. En fait, vous pouvez utiliser manuellement spl_autoload("xxxx", ".php") pour charger la classe xxxx. Ceci est en fait similaire à require/include, mais spl_autoload est relativement plus flexible car plusieurs extensions peuvent être spécifiées.

Comme mentionné précédemment, le pointeur de fonction autoload_func contenu dans spl_autoload_register est utilisé pour spécifier la fonction de chargement à utiliser. Ensuite, nous devons attribuer l'adresse de fonction correspondante à autoload_func. spl_autoload_register() implémente la fonction d'attribution d'une valeur au pointeur de fonction autoload_func. Si la fonction spl_autoload_register() ne contient aucun paramètre, la valeur par défaut est d'attribuer spl_autoload() à autoload_func.

  • spl_autoload_call 

Il y a en fait, un autoload_functions à l'intérieur, qui est essentiellement une table de hachage, ou pour une compréhension intuitive, nous l'imaginons comme un conteneur, et chaque élément à l'intérieur est un pointeur vers la fonction de chargement. Le mécanisme d'implémentation de spl_autoload_call est en fait relativement simple. Il parcourt le conteneur dans un certain ordre et exécute la fonction de chargement pointée par le pointeur de fonction à l'intérieur. Après l'exécution de chaque pointeur, il vérifiera si la classe requise a été chargée. Si le chargement est terminé, quittez. Sinon, poursuivez l'exécution vers le bas. Si la classe requise n'est toujours pas chargée après l'exécution de toutes les fonctions de chargement, spl_autoload_call() se termine directement. Cela signifie que même si le mécanisme de chargement automatique est utilisé, le chargement des classes peut ne pas être terminé. La clé réside dans la façon dont vous créez votre fonction de chargement automatique.

Puisqu'il existe un autoload_functions, comment y ajouter la fonction de chargement automatique créée ? Identique à spl_autoload, utilisez également spl_autoload_register() pour enregistrer la fonction de chargement dans autoload_functions. Bien entendu, les fonctions enregistrées peuvent être supprimées de la table de hachage depuis autoload_functions via la fonction spl_autoload_unregister(). Ceci est cohérent avec le modèle de conception d'usine écrit avant

Une chose qui doit être expliquée ici est l'ordre dans lequel spl_autoload_register implémente le chargement automatique. La séquence de chargement automatique de spl_autoload est la suivante : déterminez d'abord si autoload_func est vide, si autoload_func est vide, vérifiez si la fonction autoload est définie, si elle n'est pas définie, retournez et signalez une erreur si la fonction autoload() est définie, retournez. le résultat du chargement. Si autoload_func n'est pas vide, la fonction pointée par le pointeur autoload_func sera exécutée directement sans vérifier si autoload est défini. C'est-à-dire que les fonctions enregistrées avec spl_autoload_register() seront utilisées en premier.

 Selon l'introduction ci-dessus, si autoload_func n'est pas vide, la fonction autoload() ne peut pas être automatiquement exécutée. Si vous souhaitez toujours utiliser la fonction autoload() tout en utilisant la fonction spl_autoload_register(), vous pouvez ajouter la fonction autoload à la table de hachage via spl_autoload_register(), c'est-à-dire spl_autoload_register(autoload()). Les exemples de code suivants illustrent comment enregistrer les méthodes ordinaires et les méthodes publiques statiques d'une classe.

  普通函数的注册方法。

<?php

	/**
	* @ 普通函数的调用方法,可以调用后缀名分别为.php和.class.php的类文件
	*/
	function loadFielEndOfPhp($classname) {
		$fileName = $classname.".php";
		if (file_exist($fileName)) {
			require_once("$fileName");
		} else {
			echo $fileName." doesn&#39;t exist!"
		}
	}

	function loadFielEndOfClassPhp($classname) {
		$fileName = $classname.".class.php";
		if (file_exist($fileName)) {
			require_once("$fileName");
		} else {
			echo $fileName." doesn&#39;t exist!"
		}
	spl_autoload_register("loadFielEndOfPhp"); 
	spl_autoload_register("loadFielEndOfClassPhp");

}

  类中静态的加载函数的注册方法。

<?php

	/**
	* @ 类中静态成员函数的调用方法,可调用后缀名为.php和.class.php的文件
	*/
    class test {
		public static function loadFielEndOfPhp($classname) {
			$fileName = $classname.".php";
			if (file_exist($fileName)) {
				require_once("$fileName");
			}
			else {
				echo $fileName." doesn&#39;t exist!"
			}
		}

		public static function loadFielEndOfClassPhp($classname) {
			$fileName = $classname.".class.php";
			if (file_exist($fileName)) {
				require_once("$fileName");
			}
			else {
				echo $fileName." doesn&#39;t exist!"
			}
	}
	
	spl_autoload_register(array("test","loadFielEndOfPhp")); 
	//spl_autoload_register("test::loadFielEndOfPhp");         //上一行的另一种写法,不是使用数组的形式完成注册;
	spl_autoload_register(array("test","loadFielEndOfClassPhp"));
	//spl_autoload_register("test::loadFielEndOfClassPhp");    //第三行的另一种写法,不是使用数组的形式完成注册;

}

 

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