Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Beispiele für 3 Möglichkeiten zum automatischen Laden von PHP-Klassen

Detaillierte Beispiele für 3 Möglichkeiten zum automatischen Laden von PHP-Klassen

伊谢尔伦
伊谢尔伦Original
2017-07-01 10:26:492312Durchsuche

Ich habe kürzlich Composer gelernt und festgestellt, dass ich seit meinem Kontakt mit PHP auf drei Möglichkeiten zum automatischen Laden von Klassen gestoßen bin. Dazu gehören die automatische Lademethode von PHPs eigenen Klassen und die dritte von PHP Die Lademethode von Composer, einem Abhängigkeitsverwaltungstool eines Drittanbieters, und der automatischen Lademethode unter dem Yaf-Framework von PHP. In diesem Blog wird hauptsächlich die mit PHP5 gelieferte Lademethode im Detail vorgestellt. Das automatische Laden von Klassen unter Composer und Yaf wird beim nächsten Mal in zwei Teile unterteilt.

1. Manuelle Lademethode

Wenn Sie in Sprachen wie C und C++ verwandte Klassen und Methoden in einer anderen Datei in PHP verwenden müssen, können Sie include, include_once

, require oder require_once, um die verwendeten Dateien in das Projekt einzubinden. Unter diesen sind die Unterschiede zwischen den vier wie folgt.

    include wendet eine Datei an. Wenn die Datei nicht vorhanden ist, wird eine Aufforderung zum Überspringen und Fortfahren der Ausführung angezeigt.
  • include_once wird ausgeführt Wenden Sie auch eine Datei an, aber sie wird nur einmal angewendet. Wenn die Datei nicht vorhanden ist, wird die Ausführung fortgesetzt des Programms wird unterbrochen;
  • require_once gilt auch für eine Datei und wird nur einmal angewendet. Wenn die Datei nicht vorhanden ist, wird die Ausführung des Programms unterbrochen 🎜>
  • Welche der oben genannten vier Methoden sind erforderlich? Wenn Sie eine Datei erstellen, fügen Sie die Datei manuell in das Programm ein. Dies ist in Ordnung, wenn die Größe des Projekts relativ klein ist. Wenn die Größe des Projekts jedoch zunimmt, ist es einfach ein Albtraum, die für jede Datei erforderlichen Klassen manuell zu laden.
  • Um Ärger zu vermeiden, können Sie den Ladepfad beim Laden über

    set_include_path

    () festlegen, und Sie können den Ladepfad auch über
  • get_include_path
() abrufen. In Bezug auf set_include_path() und get_include_path() bin ich gerade mit ihnen in Kontakt gekommen. Hier werde ich nur eine kurze Einführung in set_include_path() geben und weitere hinzufügen, wenn ich in Zukunft auf Probleme stoße.

Zunächst ändert set_include_path() dynamisch den include_path in php.ini im Skript, und dieser include_path ist die Kombination aus include und require (wenn unten keine spezielle Erklärung gegeben wird, bedeutet include include und include_once). require stellt den Pfad von require und require_once dar, der festgelegt oder vordefiniert werden soll. Wenn wir a.php, b.php, c.php... im Ordner projname/home/lib/mylib/test in einer main.php-Datei verwenden müssen und der enthaltene Pfad nicht festgelegt ist, dann schreiben Sie ihn ein das folgende Formular:

Auf diese Weise muss jedes Include einen absoluten Pfad enthalten, was sehr problematisch erscheint. Wenn Sie set_include_path("projname/home/lib/mylib/test") vor der Datei hinzufügen, die eingeschlossen werden muss, kann sie in der folgenden Form geschrieben werden:

Im Vergleich zur ersten Methode Die zweite Art des Schreibens ist zeitaufwändig und mühsam. Sie spart natürlich viel Zeit, erfordert aber dennoch die Einbindung jeder Datei. Sie vereinfacht lediglich den Einbindungspfad. Die oben erwähnte Situation besteht natürlich darin, dass die erforderlichen Dateien alle in einem Ordner vorhanden sind. Wenn die Dateien in verschiedenen Ordnern vorhanden sind, können Sie zu diesem Zeitpunkt mehrere set_include_path()-Anweisungen hinzufügen Wenn der Name in mehreren Verzeichnissen vorkommt, wird nur die Datei eingebunden, die zuerst im Verzeichnis set_include_path erscheint. Wenn in allen durch set_include_path angegebenen Ordnern keine entsprechenden Dateien vorhanden sind und der Dateiname zufällig im aktuellen Ordner erscheint, enthält er die Datei direkt entsprechende Dateien im aktuellen Verzeichnis.

Die Funktion get_include_path() ist nur zum Abrufen des aktuellen Include-Pfads geeignet.
<?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");
	  ......

2._autoload und spl_autoload_register() automatische Lademethoden

<?php

    set_include_path("projname/home/lib/mylib/test");
    include("a.php");
    include("b.php");
    include("c.php");
    ......
Um Ihre Hände von der Klassenlademethode zu befreien, wird in PHP5 und späteren Versionen ein automatischer Lademechanismus bereitgestellt – -autoload. Mit Autoload können Klassen nur dann geladen werden, wenn sie tatsächlich benötigt werden, was als verzögertes Laden bezeichnet wird, anstatt alle Klassendateien von Anfang an einzubinden oder anzufordern. Der von PHP bereitgestellte automatische Lademechanismus ist in zwei Typen unterteilt: autoload () und spl_autoload_register ().

 1). Autoload-Mechanismus

Wenn beim Ausführen des Programms in PHP5 festgestellt wird, dass eine bestimmte Klasse nicht enthalten ist, wird der automatische Lademechanismus zum Hinzufügen ausgeführt Die erforderliche Klasse wird geladen. Es ist wie folgt geschrieben:

Entsprechend der Art und Weise, wie dieses Programm geschrieben ist, können wir die folgende Schlussfolgerung ziehen:

Das Prinzip der Sicherstellung des automatischen Lademechanismus besteht darin, den Klassennamen und die zu erstellen Dateiname haben eine entsprechende Beziehung,

Der Klassenname + Suffix stellt den Namen der Datei dar, in der sich diese Klasse befindet. Wenn die Datei vorhanden ist, wird die Klasse basierend auf $fileName geladen. Wenn die Datei nicht vorhanden ist, wird der Benutzer darauf hingewiesen, dass die Datei nicht vorhanden ist. Im Allgemeinen umfasst der automatische Lademechanismus drei Schritte:

<?php

	public function  autoload($classname) {
		$fileName = $classname."php";
		if (file_exist($fileName)) {
			require_once("$fileName");
		} else {
			echo $fileName." doesn&#39;t exist!"
		}
	}
Bestimmen Sie den Dateinamen basierend auf dem Klassennamen, dh bestimmen Sie eine einheitliche Korrespondenzregel zwischen dem Klassennamen und dem Dateinamen.

  • Suchen Sie die entsprechende Datei auf der Festplatte anhand des Dateinamens (das Beispiel ist der einfachste Fall, dh die Klasse und die PHP-Datei, die sie aufruft, befinden sich im selben Verzeichnis). sich nicht im selben Verzeichnis befinden, können Sie mit set_include_path() den zu ladenden Pfad

  • angeben, um die Festplattendatei in das Dateisystem zu laden Allgemeines Einschließen und Erfordernis zum Einschließen der entsprechenden Klassendatei.

  • Das Prinzip von autoload() zum Implementieren des automatischen Ladens von Klassen lautet: Es gibt eine einheitliche Entsprechung zwischen Klassennamen und Dateinamen ist der Schlüssel zur Implementierung von Autoload in einem System. Allerdings kann ein System von unterschiedlichem Personal entwickelt werden, wenn vor der Entwicklung kein einheitlicher Standard vereinbart wurde, kann es unterschiedliche entsprechende Regeln geben, was dazu führen kann, dass in autoload() mehrere Laderegeln implementiert werden müssen, was dazu führen kann, dass autoload( ) Funktion zu Sehr aufgebläht. Um dieses Problem zu lösen, bietet PHP auch einen automatischen Lademechanismus: spl_autoload_register().

     2). eine in PHP5 eingeführte Erweiterungsbibliothek. SPL-Autoload wird implementiert, indem der Funktionszeiger autoload_func auf die Autoload-Funktion zeigt. SPL verfügt über zwei verschiedene Autoload-Funktionen, nämlich spl_autoload und spl_autoload_call. Durch Verweisen auf autoload_fun auf die Adressen dieser beiden unterschiedlichen Ladefunktionen können verschiedene Autoload-Mechanismen implementiert werden.

      spl_autoload
    • spl_autoload ist die von SPL implementierte Standardfunktion zum automatischen Laden. Es handelt sich um eine Funktion, die zwei Parameter akzeptieren kann. Die erste Funktion ist $class_name, die den Namen der zu ladenden Klasse darstellt; der zweite Parameter ist $file_extension, ein optionaler Parameter, der die Erweiterung der Klassendatei darstellt. In $file_extension können mehrere Erweiterungen angegeben werden. Die Erweiterungen können durch Semikolons getrennt werden. Wenn keine Erweiterung angegeben wird, wird die Standarderweiterung .inc oder .php verwendet. spl_autoload ändert zuerst $class_name in Kleinbuchstaben und sucht dann in allen include_paths nach $class_name.inc- oder $class_name.php-Dateien. Wird die entsprechende Datei gefunden, wird die entsprechende Klasse geladen. Tatsächlich können Sie spl_autoload("xxxx", ".php") manuell verwenden, um die Klasse xxxx zu laden. Dies ähnelt eigentlich require/include, aber spl_autoload ist relativ flexibler, da mehrere Erweiterungen angegeben werden können.

    Wie bereits erwähnt, wird der in spl_autoload_register enthaltene Funktionszeiger autoload_func verwendet, um die zu verwendende Ladefunktion anzugeben. Dann müssen wir autoload_func die entsprechende Funktionsadresse zuweisen. spl_autoload_register() implementiert die Funktion, dem Funktionszeiger autoload_func einen Wert zuzuweisen. Wenn die Funktion spl_autoload_register() keine Parameter enthält, wird spl_autoload() standardmäßig autoload_func zugewiesen.

      spl_autoload_call 
    • Es gibt Tatsächlich handelt es sich im Inneren um eine autoload_functions, bei der es sich im Wesentlichen um eine Hash-Tabelle handelt. Zum intuitiven Verständnis stellen wir sie uns als Container vor, und jedes darin enthaltene Element ist ein Zeiger auf die Ladefunktion. Der Implementierungsmechanismus von spl_autoload_call ist eigentlich relativ einfach. Er durchläuft den Container in einer bestimmten Reihenfolge und führt die Ladefunktion aus, auf die der Funktionszeiger darin zeigt. Nach der Ausführung jedes Zeigers wird überprüft, ob die erforderliche Klasse geladen wurde. Wenn der Ladevorgang abgeschlossen ist, beenden Sie den Vorgang. Andernfalls führen Sie die Ausführung nach unten fort. Wenn die erforderliche Klasse nach Ausführung aller Ladefunktionen immer noch nicht geladen ist, wird spl_autoload_call() direkt beendet. Dies bedeutet, dass das Laden der Klasse möglicherweise nicht abgeschlossen wird, selbst wenn der Autoload-Mechanismus verwendet wird. Der Schlüssel liegt in der Art und Weise, wie Sie Ihre Autoload-Funktion erstellen.

    Da es eine autoload_functions gibt, wie füge ich die erstellte Autoloading-Funktion hinzu? Wie spl_autoload verwenden Sie auch spl_autoload_register(), um die Ladefunktion in autoload_functions zu registrieren. Natürlich können registrierte Funktionen über die Funktion spl_autoload_unregister() aus der Hash-Tabelle von autoload_functions gelöscht werden. Dies steht im Einklang mit dem zuvor geschriebenen

    Entwurfsmuster

    der Fabrik . Eine Sache, die hier erklärt werden muss, ist die Reihenfolge, in der spl_autoload_register das automatische Laden implementiert. Die automatische Ladesequenz von spl_autoload ist: Stellen Sie zunächst fest, ob autoload_func leer ist. Überprüfen Sie, ob die Funktion autoload_func definiert ist. Wenn sie nicht definiert ist, geben Sie einen Fehler zurück das Ladeergebnis. Wenn autoload_func nicht leer ist, wird die Funktion, auf die der Zeiger autoload_func zeigt, direkt ausgeführt, ohne zu prüfen, ob autoload definiert ist.

    Das heißt, mit spl_autoload_register() registrierte Funktionen werden zuerst verwendet.

     

    Wenn autoload_func gemäß der obigen Einführung nicht leer ist, kann die Funktion autoload() nicht automatisch ausgeführt werden. Wenn Sie die Funktion autoload() weiterhin verwenden möchten, während Sie die Funktion spl_autoload_register() verwenden, können Sie die Funktion autoload über spl_autoload_register(), also spl_autoload_register(autoload()), zur Hash-Tabelle hinzufügen. Die folgenden Codebeispiele veranschaulichen, wie gewöhnliche Methoden bzw. statische öffentliche Methoden einer Klasse registriert werden.

      普通函数的注册方法。

    <?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");    //第三行的另一种写法,不是使用数组的形式完成注册;
    
    }

     

    Das obige ist der detaillierte Inhalt vonDetaillierte Beispiele für 3 Möglichkeiten zum automatischen Laden von PHP-Klassen. 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