Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Reflexion und automatisches Laden

PHP-Reflexion und automatisches Laden

*文
*文Original
2017-12-25 16:33:431626Durchsuche

Dieser Artikel stellt hauptsächlich die Reflexion und das automatische Laden von PHP vor. Er analysiert die Prinzipien des PHP-Ladens und die Implementierungstechniken des automatischen Ladens. Ich hoffe, dass er zum Verständnis der Reflexion und des automatischen Ladens von PHP beiträgt.

Das Beispiel in diesem Artikel beschreibt, wie man Lazy Loading in PHP implementiert. Teilen Sie es als Referenz mit allen. Die spezifische Analyse lautet wie folgt:

Das übliche Laden von PHP besteht darin, externe Dateien über include (), require () und andere Methoden zu laden und dann Methoden über Instanzen aufzurufen oder statische Methoden direkt aufzurufen Das Problem besteht darin, dass einige Frameworks alle Dateien mit einem bestimmten Pfad importieren und sie direkt instanziieren können. Je mehr Klassenpakete Sie schreiben, desto mehr können Sie sie verwenden. desto mehr Dinge müssen geladen werden, was sich auf die Programmleistung auswirkt.

Sie können eine Reflexionsklasse der entsprechenden Klasse direkt über die Reflexionsklasse ReflectionClass von PHP erhalten:

Die Datei test.php lautet wie folgt:


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


Die index.php-Datei lautet wie folgt:


<?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)


Instanziieren Sie eine ReflectionClass und übergeben Sie den Klassennamen. Sie erhalten eine Reflexionsklasse der entsprechenden Klasse. Durch den Aufruf von newInstance mit einer Instanz wird eine Instanz der Reflection-Klasse abgerufen und somit die Instanziierung abgeschlossen.

Über die Methode get_included_files() können wir die von der aktuellen Seite eingeführten Dateien sehen. Vor der Instanziierung der Reflection-Klasse gibt es nur die Datei index.php. Nach der Instanziierung der Reflection-Klasse wird automatisch eine test.php-Datei eingeführt. Schauen Sie sich dann den obigen Code an und stellen Sie fest, dass es eine magische Methode namens __autoload() gibt Methode Die automatische Ladedatei ist definiert. Wenn ReflectionClass die Klasse auf der aktuellen Seite nicht finden kann, ruft sie __autoload() auf, um die Klasse zu laden. Dies ist der Vorgang des automatischen Ladens.

Wenn Sie wissen möchten, ob die Methode __autoload() aktiviert ist, können Sie dies über die Methode in der PHP-Standardbibliothek SPL überprüfen:


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)


Die Methode sql_autoload_functions() wird verwendet, um die aktuelle Autoloading-Methode anzuzeigen. Es gibt derzeit eine __autoload Magic-Methode, daher wird der Funktionsname zurückgegeben, wenn die Autoloading-Methode nicht definiert ist Die Methode spl_autoload_register () dient dazu, eine Methode über den Methodennamen für die automatische Lademethode zu registrieren. Hier wird die Methode newAutoload verwendet, um die Methode __autoload zu ersetzen.

In der newAutoload-Methode wird bei jeder erfolgreichen Ausführung der Satz „Erfolg erforderlich“ gedruckt. Er wird nur einmal gedruckt, was darauf hinweist, dass der Test zwar dreimal instanziiert wurde Wenn die Klasse einmal geladen wurde, wird die automatische Lademethode nicht mehr ausgeführt. Die Methode zum Laden von Klassen über getInstance() ist viel praktischer als die vorherige include(). Sie müssen nur die Datei mit der darauf geschriebenen getInstance()-Methode laden.

Die überschriebene automatische Lademethode kann je nach Bedarf unterschiedliche Dateipfade definieren, indem sie den Namen der Klasse beurteilt. getInstance kann statische Variablen zum Speichern von Instanzen verwenden, wobei auch das Singleton-Muster im Entwurfsmuster verwendet wird.

Verwandte Empfehlungen:

PHP-Objekt zum automatischen Laden (mit MVC-Framework als Beispiel)

PHP-Funktion zum automatischen Laden __autoload()

PHP-Reflexionsmechanismus

Das obige ist der detaillierte Inhalt vonPHP-Reflexion und automatisches Laden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn