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.
set_include_path
() festlegen, und Sie können den Ladepfad auch überAuf 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"); ......
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't exist!" } }
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.
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.
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
Entwurfsmusterder 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. 普通函数的注册方法。 类中静态的加载函数的注册方法。 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!<?php
/**
* @ 普通函数的调用方法,可以调用后缀名分别为.php和.class.php的类文件
*/
function loadFielEndOfPhp($classname) {
$fileName = $classname.".php";
if (file_exist($fileName)) {
require_once("$fileName");
} else {
echo $fileName." doesn't exist!"
}
}
function loadFielEndOfClassPhp($classname) {
$fileName = $classname.".class.php";
if (file_exist($fileName)) {
require_once("$fileName");
} else {
echo $fileName." doesn'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't exist!"
}
}
public static function loadFielEndOfClassPhp($classname) {
$fileName = $classname.".class.php";
if (file_exist($fileName)) {
require_once("$fileName");
}
else {
echo $fileName." doesn't exist!"
}
}
spl_autoload_register(array("test","loadFielEndOfPhp"));
//spl_autoload_register("test::loadFielEndOfPhp"); //上一行的另一种写法,不是使用数组的形式完成注册;
spl_autoload_register(array("test","loadFielEndOfClassPhp"));
//spl_autoload_register("test::loadFielEndOfClassPhp"); //第三行的另一种写法,不是使用数组的形式完成注册;
}