Heim > Artikel > PHP-Framework > So verstehen Sie das automatische Laden des ThinkPHP Loader
Dieser Artikel vermittelt Ihnen das relevante Wissen über das automatische Laden des Loaders in thinkphp. Er enthält hauptsächlich das relevante Wissen über das Laden von Composer.
1. Automatisches Laden der Loader-Quellcodeanalyse
1-1 Lernziele
Zwei Möglichkeiten, Klassen automatisch zu laden
spl_autoload_register muss verwendet werden können
zum Implementieren des automatischen Ladens benutzerdefinierter Dateiklassen
Bildbeschreibung hier einfügen Zuerst in die Loader-Klasse base.php laden und dann das Register aufrufen Verfahren.
Kommen Sie zu thinkphplibrarythinkLoader.php und es gibt eine Registermethode. In dieser Methode lernen wir zunächst den ersten Wissenspunkt spl_autoload_register() und sprechen über das vergangene und gegenwärtige Leben und die einfache Verwendung von spl_autoload_register .Der nächste Schritt ist der Wurzelpfad des Projekts und der Pfad des Komponisten.
Hier Bildbeschreibung einfügenAb hier wird die Composer-Datei geladen. Der Vorgang ist ebenfalls sehr einfach.
Bestimmen Sie, ob Composer ein Verzeichnis ist.
Bestimmen Sie, ob sich unter dem Pfad autoload_static.php befindet Datei
Führen Sie die Datei autoload_static.php ein
So können wir die entsprechenden Attributwerte direkt in der Klasse ComposerStaticInit30742487e00917c888d89ba216f165b9 abrufen, bei der es sich um die beiden Attributwerte im Bild oben handelt.
wird verwendet, um das Obige zu überprüfen und ein Breakpoint-Debugging durchzuführen. Wenn Sie diese Daten sehen, wird die gleiche Registrierungsmethode verwendet.
Bis jetzt ist die Namespace-Registrierung abgeschlossen. Schauen wir uns als nächstes an, was der psr4-Namespace ist.1-4 Was ist Psr4?
Unter psr versteht man einfach den Dateipfad und die relevanten Spezifikationen zum automatischen Laden der entsprechenden Klassen. Derzeit verwendet TP5.1 die psr4-Spezifikation. Die Klassen beziehen sich hier auf Klassen , Schnittstelle, SuperklassenstrukturEine vollständige Klasse erfordert die folgende Struktur
Die folgenden Spezifikationen werden aus PHP-Dokumenten abgeleitet
Ein vollständiger Klassenname muss vorhanden sein ein Namespace der obersten Ebene, der als „Anbieter-Namespace“ bezeichnet wird;
Ein vollständiger Klassenname kann einen oder mehrere Unternamespaces haben;
Der Unterstrich in einem beliebigen Teil des vollständigen Klassennamens hat keine besondere Bedeutung.
Der vollständige Klassenname kann aus beliebigen Groß- und Kleinbuchstaben bestehen.
Das Folgende ist ein offizielles Beispiel. Wenn Sie diese PSR-Spezifikation verstehen können, versuchen Sie, sie zu verstehen.
1-5 Laden der Klassenbibliothekszuordnungsdatei Frage, was ist hier los? Es gibt keine classmap.php-Datei.
Beeilen Sie sich nicht, geraten Sie nicht in Panik, führen Sie zuerst PHP Think Optimize: Autoload aus, um die Datei herauszuholen.
Schließlich erreichen Sie die Methode addClassMap. Bei dieser Methode weisen Sie einfach die Daten zu der Datei classmap.php zu $classMap ist einfach, es gibt keine andere Verwendung
1-6 Das Erweiterungsverzeichnis automatisch ladenextend Dieses Verzeichnis wird von allen verwendet, die das TP-Framework verwendet haben In diesem Verzeichnis kann eine Bibliotheksdatei gespeichert werden.
Wie Sie auf dem Bild unten sehen können, verwenden Sie zum Laden
In der Methode weisen Sie nur den Erweiterungspfad dem Attribut $fallbackDirsPsr4 zu.
Dies ist das Ende des Loader::register(); Dann werfen wir einen detaillierten Blick auf die interne Implementierung und praktische Fälle.
Der obige Lesequellcode enthält vier Attribute. Lassen Sie uns sie kurz organisieren. 2. Beschreiben Sie kurz den Ladevorgang der Klasse. Fügen Sie hier eine Bildbeschreibung ein
Als ich hier gerade mit dem Parsen des Quellcodes begonnen habe, gab es eine Funktion spl_autoload_registerWenn die zu verwendende Klasse nicht eingeführt wurde, wird diese Funktion ausgelöst, bevor PHP einen Fehler meldet, und der undefinierte Klassenname wird als übergeben ein Parameter und geht direkt hierher. Führen Sie die think\Loader::autoload-Methode aus
Die erste entladene Klasse nach dem Haltepunkt ist thinkErrorWarum ist es thinkError! Sie können zu thinkphp/base.php zurückkehren und einen Blick darauf werfen. Die erste auszuführende Klasse ist Error
Sie können einfach einen Test durchführen, den Error in Kaka ändern und Drucken Sie es aus. Die Klasse wechselt zu diesem Zeitpunkt zu Kaka. Zu diesem Zeitpunkt hat jeder ein gewisses Verständnis für den automatischen Lademechanismus dieser Klasse. Wenn die verwendete Klasse nicht eingeführt wurde, wird diese Klasse als Parameter an die Autoload-Methode von thinkphp/library/think/Loader.php übergeben.
Kommen Sie hierher und schauen Sie sich die Autoload-Methode an
Beginnen Sie zunächst mit der findFile-Methode und übergeben Sie die unbenannte Klasse an diese Methode. In der findFile-Methode wird sie direkt aus dem classMap-Attribut abgerufen . Geben Sie die von der thinkError-Klasse zugeordnete Datei direkt zurück Nachdem der vollständige Pfad der thinkError-Klasse an die Dateivariable von Autoload zurückgegeben wurde, wird der Fall der Win-Umgebung einmal beurteilt.Dann verwenden Sie einfach include, um die Datei einzuführen, bis sie zurückgegeben wird.
Bis zu diesem Punkt erfolgt eine vollständige automatische Belastungsanalyse der Klasse.
Obwohl es hier endet, muss ich noch das Attribut $classMap erwähnen. Dieses Attribut basiert auf der Datei classmap.php. Die Generierung dieser Datei erfordert auch die Ausführung des Befehls php think activate:autoload.
Wie wird das Programm ausgeführt, wenn diese Datei nicht generiert wird?
Alle vorherigen Prozesse sind gleich, nur findFile ist anders. Lassen Sie uns das kurz klären.
Zu diesem Zeitpunkt wird der Code definitiv nicht durch classMap gehen
Zuerst die thinkError-Datei abrufen
Rufen Sie dann den Namespace über die beiden Attribute beim automatischen Laden von Composer ab und verbinden Sie dann die Datei thinkError.php
Das zurückgegebene Endergebnis ist auch die Datei D:phpstudy_proWWWThinkPHPSourceCodeAnalysisthinkphplibrarythinkError.php.
Der Code hier muss sorgfältig gelesen werden.
Das automatische Laden von Klassen ist hier komplett vorbei. 3. Wie man das automatische Laden von Klassen mit benutzerdefinierten Dateien implementiert ein Fehler, also wie sollen wir ihn bedienen, damit wir direkt darauf zugreifen können!
Hier Bildbeschreibung einfügen
Zu diesem Zeitpunkt wird die Bedeutung des Quellcodes deutlich. Denken Sie daran, dass in der automatisch geladenen Registerfunktion das Erweiterungsverzeichnis geladen wurde Hier Bildbeschreibung einfügenDieses I Habe ein Kaka-Verzeichnis hinzugefügt und direkt darauf zugegriffen Kein Problem, es kam direkt heraus. Alles ist in Ordnung. Lassen Sie uns nun über die Lademethode des Umfangs sprechen. Als ich über die Registrierung des Klassenbibliotheksverzeichnisses für das automatische Laden sprach, habe ich nur erklärt, dass ich nur den Pfad zum Attribut $fallbackDirsPsr4 gespeichert habe, ohne auf Details einzugehen. Der nächste Schritt besteht darin, diese zu erklären.Die einzige Möglichkeit, den Quellcode zu lesen, besteht darin, ihn zu implementieren und dann anzuzeigen
Hier Bildbeschreibung einfügenSolange die definierte Klasse eingegeben wird, wird sie zum automatischen Laden automatisch geladen
Ja Geben Sie auch die findFile-Methode ein
Sie können diesen Code in der findFile-Methode sehen. Dieses Attribut wird dem Attribut $fallbackDirsPsr4 hinzugefügt, wenn das Erweiterungsverzeichnis automatisch geladen wird.
Sehen Sie sich die Daten an, wenn Sie die Parameterklasse in findFile drucken.
Sie können die testKaka-Klasse deutlich sehen
Dann verwenden Sie __include_file, um die von uns definierte Datei direkt einzubindenD:phpstudy_proWWWThinkPHPSourceCodeAnalysiskakatestKaka.php. Wie realisiert die obige benutzerdefinierte Datei das automatische Laden von Klassen und ist auch die Lademethode von Extend(empfohlenes Lernen:
thinkphp5)
Das obige ist der detaillierte Inhalt vonSo verstehen Sie das automatische Laden des ThinkPHP Loader. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!