Maison  >  Article  >  développement back-end  >  Réflexion PHP et chargement automatique

Réflexion PHP et chargement automatique

*文
*文original
2017-12-25 16:33:431584parcourir

Cet article présente principalement la réflexion et le chargement automatique de PHP. Il analyse les principes du chargement PHP et les techniques de mise en œuvre du chargement automatique avec des exemples. J'espère qu'il sera utile à chacun pour comprendre la réflexion et le chargement automatique de PHP.

L'exemple de cet article décrit comment implémenter le chargement différé en PHP. Partagez-le avec tout le monde pour votre référence. L'analyse spécifique est la suivante :

Le chargement PHP ordinaire consiste à charger des fichiers externes via include(), require() et d'autres méthodes, puis à appeler des méthodes via des instances ou à appeler directement des méthodes statiques. écrivez des instructions d'introduction comme celle-ci. Problème, certains frameworks importeront tous les fichiers avec un chemin spécifique et les utiliseront en les instanciant directement. Cependant, certains packages de classe peuvent ne pas être utilisés de cette manière. Plus vous écrivez de packages de classe, plus il y a de choses. vous devez charger, ce qui affecte les performances du programme.

Vous pouvez obtenir directement une classe de réflexion de la classe correspondante via la classe de réflexion de PHP ReflectionClass :

Le fichier test.php est le suivant :


<?php
 class test{
   public function showName(){
     var_dump(__CLASS__);
   }
 }
?>


Le fichier index.php est le suivant :


<?php
var_dump(get_included_files()); 
$rf = new ReflectionClass(&#39;test&#39;);
var_dump(get_included_files());
$testObj = $rf->newInstance();
$testObj->showName();
function __autoload($classname){
  $classpath = &#39;./&#39; . $classname . &#39;.php&#39;;
  if (file_exists($classpath)) {
    require_once($classpath);
  }else {
    echo &#39;class file&#39;.$classpath.&#39;not found!&#39;;
  }
}
?>
//array
// 0 => string &#39;D:\code\www\test\index.php&#39;(length=26)
//array
// 0 => string &#39;D:\code\www\test\index.php&#39;(length=26)
// 1 => string &#39;D:\code\www\text\test.php&#39;(length=25)
//string &#39;test&#39; (length=4)


Instanciez une ReflectionClass et transmettez le nom de la classe, et vous obtiendrez une classe de réflexion de la classe correspondante. L’appel de newInstance avec une instance obtiendra une instance de la classe de réflexion, complétant ainsi l’instanciation.

Grâce à la méthode get_inclus_files(), nous pouvons voir les fichiers introduits par la page actuelle. Avant d'instancier la classe de réflexion, il n'y a que le fichier index.php. Après l'instanciation de la classe de réflexion, un fichier test.php est automatiquement introduit. Regardez ensuite le code ci-dessus et constatez qu'il existe une méthode magique nommée __autoload(). méthode Le chargement automatique des fichiers est défini et ReflectionClass appellera __autoload() pour charger la classe lorsqu'il ne trouvera pas la classe sur la page actuelle. C'est le processus de chargement automatique.

Si vous souhaitez savoir si la méthode __autoload() est activée, vous pouvez la vérifier via la méthode dans la bibliothèque standard PHP SPL :


var_dump(spl_autoload_functions());
spl_autoload_register(&#39;newAutoload&#39;);
var_dump(spl_autoload_functions());
$testObj1 = getInstance(&#39;test&#39;);
$testObj2 = getInstance(&#39;test&#39;);
$testObj3 = getInstance(&#39;test&#39;);
function getInstance($class, $returnInstance = false){
  $rf = new ReflectionClass($class);
  if ($returnInstance)
     return $rf->newInstance();
}
function newAutoload($classname){
  $classpath = &#39;./&#39; . $classname . &#39;.php&#39;;
  if (file_exists($classpath)) {
    var_dump(&#39;require success&#39;);
    require_once($classpath);
  } else {
    echo &#39;class file &#39; . $classpath . &#39; not found!&#39;;
  }
}
//array
// 0 => string &#39;__autoload&#39; (length=10)
//array
// 0 => string &#39;newAutoload&#39; (length=11)
//string &#39;require success&#39; (length=15)


La méthode sql_autoload_functions() est utilisée pour afficher la méthode de chargement automatique actuelle. Il existe actuellement une méthode magique __autoload, donc le nom de la fonction est renvoyé si la méthode de chargement automatique n'est pas définie, false est. est renvoyé et la méthode spl_autoload_register () consiste à enregistrer une méthode dans la méthode de chargement automatique via le nom de la méthode. Ici, la méthode newAutoload est utilisée pour remplacer la méthode __autoload.

Dans la méthode newAutoload, chaque fois que l'exécution réussit, la phrase 'require success' est imprimée une seule fois, indiquant que bien que ReflectionClass('test') ait été instancié 3 fois, le test. la classe a été chargée une fois, la méthode de chargement automatique ne sera plus exécutée. La méthode de chargement des classes via getInstance() est beaucoup plus pratique que la précédente include(). Il vous suffit de charger le fichier avec la méthode getInstance() écrite dessus.

La méthode de chargement automatique remplacée peut définir différents chemins de fichiers en fonction des besoins en jugeant le nom de la classe. getInstance peut utiliser des variables statiques pour enregistrer des instances, qui utilisent également le modèle singleton dans le modèle de conception.

Recommandations associées :

Objet à chargement automatique PHP (avec le framework MVC comme exemple)

fonction de chargement automatique php __autoload()

mécanisme de réflexion php

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