Heim  >  Artikel  >  PHP-Framework  >  ThinkPHP lädt automatisch die Loader-Quellcodeanalyse

ThinkPHP lädt automatisch die Loader-Quellcodeanalyse

咔咔
咔咔Original
2020-09-16 10:22:172402Durchsuche

Ich habe lange darüber nachgedacht und endlich angefangen, eine Artikelserie zu schreiben, die mit Werbung und Interviews zurechtkommt. Wenn Sie beim Lesen dieses Artikels auf heiße Interviewfragen oder technische Schwierigkeiten stoßen, die Kaka nicht geschrieben hat, weisen Sie bitte im Kommentarbereich darauf hin und verbessern Sie sie gemeinsam.

Vorwort

Wir arbeiten derzeit an der PHP-Advanced-Roadmap, wenn es gute Vorschläge gibt, wird Kaka diese so schnell wie möglich aufnehmen.

1. Automatisches Laden der Loader-Quellcode-Analyse

1-1 Lernziele

  • Zwei Möglichkeiten, Klassen automatisch zu laden
  • spl_autoload_register muss in der Lage sein um
  • zum automatischen Laden benutzerdefinierter Dateiklassen zu verwenden

1-2 Composer-Laden

ThinkPHP lädt automatisch die Loader-Quellcodeanalyse
Bildbeschreibung hier einfügen
Klicken Sie auf das Bild oben In der Analyse In dem von Ka angegebenen Diagramm wird zuerst die Loader-Klasse in base.php geladen und dann die Registermethode aufgerufen.

ThinkPHP lädt automatisch die Loader-QuellcodeanalyseKommen Sie zu thinkphplibrarythinkLoader.php有一个register的方法,在这个方法里边,我们先学习第一个知识点spl_autoload_register() und sprechen Sie über das vergangene und gegenwärtige Leben und die einfache Verwendung von spl_autoload_register , klicken Sie einfach zum Anzeigen.

Der nächste Schritt ist der Wurzelpfad des Projekts und der Pfad des Komponisten.

ThinkPHP lädt automatisch die Loader-Quellcodeanalyse
Hier Bildbeschreibung einfügen

Ab hier beginnt das Laden der Composer-Datei, der Vorgang ist ebenfalls sehr einfach

  • 1. Bestimmen Sie, ob Composer ein Verzeichnis ist
  • 2 Pfad. Ob PHP eine Datei ist
  • 3. Geben Sie die Datei autoload_static.php ein b9
  • 6. Bestimmen Sie ComposerStaticInit30742487e00917c888d89ba216f165b9 Ob das Array Daten enthält
  • Dann können Sie zur Datei Vendorcomposerautoload_static.php gehen, um diese beiden Attribute anzuzeigen
  • self::${$attr} = $composerClass::${$attr};,这里的就是<code style="overflow-wrap: 0px 2px; „Operator Mono“, Consolas, Monaco, Monospace; Farbe: rgb(53, 148, 247); border-radius: 2px; height: 21px; line-height: 22px;数据,外层在加一个<code style=" overflow-wrap: break-word rand: schriftfamilie: mono consolas monaco menlo monospace wortbruch: alles brechen farbe: rgb hintergrund: rgba polsterung: randradius: h line-height:>$符号。

    ThinkPHP lädt automatisch die Loader-Quellcodeanalyse从而在self::${$attr} = $composerClass::${$attr};,这里的$attr就是'prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files'这些数据,外层在加一个$符号。

    从而在ComposerStaticInit30742487e00917c888d89ba216f165b9

    ThinkPHP lädt automatisch die Loader-Quellcodeanalyse
    Hier Bildbeschreibung einfügen

    1-3 Namespace registrieren

    Datei oder thinkphplibrarythinkLoader.php'sregister method thinkphplibrarythinkLoader.phpregister方法

    在这里注册了俩个命令空间,分别为think和traits。然后会进入到addNamespace这个方法中ThinkPHP lädt automatisch die Loader-QuellcodeanalyseaddNamespace方法中,添加了Psr4空间

    registriert hier zwei Befehlsräume, nämlich think und traits. Dann geben Sie die addNamespace-Methode Bildbeschreibung hier einfügenInaddNamespace -Methode, hinzugefügt <code style="overflow-wrap: break-word; margin: 0px 2px; Font-family: „Operator Mono“, Consolas, Monaco, Menlo, monospace; word-break: break- all; color : rgb(53, 148, 247); Hintergrund: rgba(59, 170, 0,1); padding: 0px 2px; height: 21px;">Psr4 Space Code>🎜<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;"><img src="https://img-blog.csdnimg.cn/2020091320281021.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZhbmdrYW5nNw==,size_16,color_FFFFFF,t_70#pic_center" alt="ThinkPHP lädt automatisch die Loader-Quellcodeanalyse" style="max-width:90%">Dann kommen Sie zur addPsr4-Methode, die beide Namespaces in <code style="overflow-wrap: break-word; margin: 0px 2px; font-family: " operator mono consolas monaco menlo monospace registriert. wortumbruch: alle brechen hintergrund: rgba randradius: :>In den Eigenschaften $prefixLengthsPsr4 und $prefixDirsPsr4 der Klasse ComposerStaticInit1e269472f484e157e90227b420ffca7aComposerStaticInit1e269472f484e157e90227b420ffca7a类的$prefixLengthsPsr4和$prefixDirsPsr4这俩个属性中

    ThinkPHP lädt automatisch die Loader-Quellcodeanalyse为了验证上面做一个断点调试,看到这些数据就应该清晰了,至于traits也是一样的注册方式。

    截止到这里命名空间就注册完成了,接下来研究一下psr4命名空间是个什么东东。ThinkPHP lädt automatisch die Loader-Quellcodeanalyse

    1-4 Psr4是什么玩意

    psr是简单的理解就是文件路径、自动加载对应类的相关规范、目前TP5.1使用的是psr4规范

    此处的类是指class、接口、超类结构

    一个完整的类需要一下结构()*

    Bildbeschreibung hier einfügen Um das oben Gesagte zu überprüfen, führen Sie ein Breakpoint-Debugging durch. Es sollte klar sein, wenn Sie diese Daten sehen. Was den traits</code-stil> wird auf die gleiche Weise registriert.

    Bis jetzt ist die Namespace-Registrierung abgeschlossen. Schauen wir uns als nächstes an, was der psr4-Namespace ist. 🎜

    1-4 Was ist Psr4

    🎜psr ist einfach ist der Dateipfad, automatisches Laden der relevanten Spezifikationen der entsprechenden Klasse. Derzeit verwendet TP5.1 die psr4-Spezifikation🎜🎜Die Klasse bezieht sich hier auf die Klassen-, Schnittstellen- und Superklassenstruktur🎜🎜Eine vollständige Klasse erfordert den folgenden Strukturcode style ="overflow-wrap: break-word; margin: 0px 2px; Font-family: „Operator Mono“, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(53, 148, 247 ) ;Hintergrund: rgba(59, 170, 250, 0,1); Innenabstand: 21px;">)* 🎜🎜Die folgenden Spezifikationen stammen aus der PHP-Dokumentation🎜
    • Der vollständige Klassenname muss einen Namensraum der obersten Ebene haben, der als „Anbieter-Namensraum“ bezeichnet wird.

    • Der vollständige Klassenname kann einen oder mehrere Unternamensräume haben Der Name muss einen endgültigen Klassennamen haben. Der Unterstrich in jedem Teil des vollständigen Klassennamens hat keine besondere Bedeutung. Der vollständige Klassenname kann auf jeden Fall aus Buchstaben 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

      An diesem Punkt wird es definitiv eine Frage geben: Warum gibt es hier keine classmap.php-Datei? ThinkPHP lädt automatisch die Loader-QuellcodeanalyseKeine Eile, keine Panik, führen Sie es einfach zuerst ausphp think optimize:autoload把文件弄出来ThinkPHP lädt automatisch die Loader-Quellcodeanalyse最终会走到addClassMap这个方法,在这个方法中,只是把classmap.php这个文件的数据赋值给$classMap, es gibt keine andere VerwendungThinkPHP lädt automatisch die Loader-Quellcodeanalyse

      1-6 Das Erweiterungsverzeichnis automatisch laden

      extend Dieses Verzeichnis wurde von vielen Menschen verwendet Wer das TP-Framework verwendet hat, kann in diesem Verzeichnis benutzerdefinierte Klassenbibliotheksdateien speichern.

      Wie Sie auf dem Bild unten sehen können, verwenden Sie addAutoLoadDir Diese Methode wird zum Laden verwendet addAutoLoadDir这个方法进行加载的

      ThinkPHP lädt automatisch die Loader-Quellcodeanalyse在方法中也仅仅是把extend的路径赋值给了$fallbackDirsPsr4这个属性。

      ThinkPHP lädt automatisch die Loader-Quellcodeanalyse截止到这里Loader::register();

      Bildbeschreibung hier einfügen$fallbackDirsPsr4

    Hier endenLoader::register( ) ;Dieser Teil ist vorbei. Schauen wir uns die interne Implementierung und praktische Fälle genauer an. 🎜🎜Der obige Lesequellcode enthält vier Attribute. Lassen Sie uns sie kurz organisieren🎜2. Kurze Beschreibung des Ladevorgangs der Klasse singen Sie den Quellcode Hier gibt es eine Funktion<img src="https://img-blog.csdnimg.cn/20200915002436209.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZhbmdrYW5nNw==,size_16,color_FFFFFF,t_70#pic_center" alt="ThinkPHP lädt automatisch die Loader-Quellcodeanalyse" style="max-width:90%"> Wenn die zu verwendende Klasse nicht eingeführt wurde, wird diese Funktion ausgelöst, bevor PHP einen Fehler meldet. Der undefinierte Klassenname wird als Parameter übergeben und direkt ausgeführt <code style="overflow-wrap: break -word; Rand: 0px 2px; 170, 250 , 0,1); padding: 0px 2px; border-radius: 21px; line-height: 22px;">think\Loader::autoloadDie erste nach dem Passieren Der Haltepunkt ist nicht geladen. Die Klasse ist thinkError

    ThinkPHP lädt automatisch die Loader-QuellcodeanalyseWarum denkenError! Sie können zu thinkphp/base.phpSehen Sie, die erste Klasse, die nach Abschluss des automatischen Ladens ausgeführt wird, ist Error<code style="overflow-wrap: break-word; margin: 0px 2px; font-family: " operator mono consolas monaco menlo monospace word-break: break-all color: rgb background: rgba padding: border-radius: height: line-height:>thinkphp/base.php看一下,当自动加载完执行完成后第一个执行的类就是Error

    ThinkPHP lädt automatisch die Loader-Quellcodeanalyse可以简单的做个测试,将这Error改为Kaka,进行打印一下,这时的类就改变为Kaka。到这里大家对这个类的自动加载机制就有一定的了解了。

    当使用的类没有被引入时会把这个类当做参数传到thinkphp/library/think/Loader.phpautoload

    Bildbeschreibung hier einfügenSie können einfach einen Test durchführen, den Fehler in Kaka ändern, ihn drucken und die Klasse wird in Kaka geändert. Zu diesem Zeitpunkt hat jeder ein gewisses Verständnis für den automatischen Lademechanismus dieser Klasse.

    ThinkPHP lädt automatisch die Loader-QuellcodeanalyseWenn die verwendete Klasse nicht eingeführt wird, wird diese Klasse als Parameter an thinkphp/library/think/Loader.php" , Consolas, Monaco, Monospace; Farbe: rgb(59, 170, 250, 0,1); 2px; height: 21px; line-height: 22px;">autoload Methode.

    ThinkPHP lädt automatisch die Loader-QuellcodeanalyseKommen Sie hierher und schauen Sie sich die Autoload-Methode an. Beginnen Sie mit der findFile-Methode und übergeben Sie die unbekannte Klasse an diese Methode. Die thinkError-Klasse wird direkt aus dem classMap-Attribut übertragen werden direkt zurückgegeben

    ThinkPHP lädt automatisch die Loader-QuellcodeanalyseGibt den vollständigen Pfad der thinkError-Klasse zurück zu autoloads Datei wird die Größe der Win-Umgebung einmal beurteilt. <code style="overflow-wrap: break-word; margin: 0px 2px; font-family: " operator mono consolas monaco menlo monospace word-break: break-all color: rgb background: rgba padding: border-radius: height: line-height:>autoloadfile变量后,把win环境的大小写给判断了一次。

    然后直接使用include引入文件即可,直到返回。

    直到这里就是一次完整的类的自动加载解析。

    ThinkPHP lädt automatisch die Loader-Quellcodeanalyse虽然到这里结束了,但是还是得在提一点就是$classMap这个属性,这个属性是基于文件classmap.php来到,这个文件的生成也是需要执行命令php think optimize:autoload生成的。

    当没有生成这个文件时程序是如何执行的呢!

    之前的所有流程都是一样的,只有在findFile

    Dann verwenden Sie direkt include Importieren Sie einfach die Datei, bis sie zurückgegeben wird.

    Bis hierher erfolgt eine vollständige automatische Belastungsanalyse der Klasse. 🎜🎜Obwohl es hier endet, muss ich noch eines erwähnen: $classMapDieses Attribut basiert auf der Dateiclassmap.php ist hier. Die Generierung dieser Datei erfordert auch die Ausführung des Befehls php think activate:autoloadGeneriert. 🎜🎜Wie wird das Programm ausgeführt, wenn diese Datei nicht generiert wird? 🎜🎜Alle vorherigen Prozesse sind gleich, nur in findFileDas ist anders, lassen Sie es uns kurz klären. 🎜🎜Der Code wird derzeit definitiv nicht classMap folgen🎜

    ThinkPHP lädt automatisch die Loader-QuellcodeanalyseZuerst die thinkError-Datei abrufen

    ThinkPHP lädt automatisch die Loader-QuellcodeanalyseDann den Namespace über die beiden Attribute beim automatischen Laden von Composer abrufen und dann die thinkError.php-Datei zusammenfügen

    ThinkPHP lädt automatisch die Loader-QuellcodeanalyseDas zurückgegebene Endergebnis ist auch D:phpstudy_proWWWThinkPHPSourceCodeAnalysisthinkphplibrarythinkError.phpdiese Datei.

    Der Code hier muss sorgfältig gelesen werden.

    Das automatische Laden von Klassen ist hier komplett vorbei.

    3. So implementieren Sie das automatische Laden von Klassen mit benutzerdefinierten Dateien

    Erstellen Sie zunächst einen Ordner kaka

    ThinkPHP lädt automatisch die Loader-Quellcodeanalyse Fügen Sie dann die Datei Kaka.php

    ThinkPHP lädt automatisch die Loader-Quellcodeanalyse in den Controller-Index für den direkten Zugriff ein, dieses Die Klasse wird auf jeden Fall einen Fehler melden. Wie sollten wir sie also bedienen, damit wir direkt darauf zugreifen können?

    ThinkPHP lädt automatisch die Loader-Quellcodeanalyse
    Hier Bildbeschreibung einfügen

    Zu diesem Zeitpunkt wird die Bedeutung des Quellcodes deutlich. Denken Sie daran, register-Funktion, das Erweiterungsverzeichnis wird geladenregister函数中,加载过extend目录

    ThinkPHP lädt automatisch die Loader-Quellcodeanalyse
    ThinkPHP lädt automatisch die Loader-Quellcodeanalyse

    这时在加一个kaka这个目录,直接进行访问一下

    ThinkPHP lädt automatisch die Loader-Quellcodeanalyse没毛病,直接就出来了。一切OKThinkPHP lädt automatisch die Loader-Quellcodeanalyse在这里在聊一下关于extent的加载方式

    在之前聊注册自动加载类库目录只是说明了一下只是把路径存到了$fallbackDirsPsr4

     Hier Bildbeschreibung einfügen ZhbmdrYW5nNw==,size_16 ,color_FFFFFF,t_70 #pic_center" alt="Bildbeschreibung hier einfügen" style="max-width: 100%; border-radius: 6px; object-fit: include; 999;"/>Kein Problem, es kam direkt heraus. Alles ist in Ordnung nNw ==,size_16,color_FFFFFF,t_70#pic_center" alt ="Bildbeschreibung hier einfügen" style="max-width: 100%; border-radius: 6px; display: block; margin: 20px auto; object-fit: include; box-shadow: 2px 4px 7px #999;" />Hier werden wir über die Lademethode des Umfangs sprechen🎜🎜Als ich zuvor über die Registrierung des Klassenbibliotheksverzeichnisses für das automatische Laden gesprochen habe, habe ich gerade erklärt, dass ich gerade den Pfad zu $fallbackDirsPsr4 Attribut, ich werde sie nicht näher erläutern nächste. 🎜🎜Das Lesen des Quellcodes kann nur durch Implementierung und anschließende Überprüfung erfolgen🎜
    ThinkPHP lädt automatisch die Loader-Quellcodeanalyse
    Hier Bildbeschreibung einfügen

    Solange die definierte Klasse eingegeben wird, wird sie zum automatischen Laden auf Autoload umgestellt

    Es wird auch auf findFileDiese MethodefindFile这个方法

    ThinkPHP lädt automatisch die Loader-Quellcodeanalyse在findFile这个方法中可以看到这段代码,这个属性是不是很熟悉,就是自动加载extend目录时添加到$fallbackDirsPsr4属性的。

    ThinkPHP lädt automatisch die Loader-Quellcodeanalyse当在findFile中打印参数class时看一下数据

    很清楚地可以看到testKaka

    ThinkPHP lädt automatisch die Loader-Quellcodeanalyse $fallbackDirsPsr4
    -Attribut. 🎜🎜Sehen Sie sich beim Drucken der Parameterklasse in findFile die Daten an🎜🎜Sie können deutlich sehentestKakaDiese Klasse🎜

    ThinkPHP lädt automatisch die Loader-QuellcodeanalyseThinkPHP lädt automatisch die Loader-QuellcodeanalyseJetzt drucken Sie diesen$ Die Datei wurde zurückgegeben in fallbackDirsPsr4 Attribut zZG4ubmV0L2ZhbmdrYW5nNw== ,size_16,color_FFFFFF,t_70#pic_center" alt="Bildbeschreibung hier einfügen" style="max-width: 100%; border-radius: 6px; display: block; margin: 20px auto; object-fit: include; box -shadow: 2px 4px 7px #999;"/> Dann verwenden Sie __include_file zum direkten EinschließenD:phpstudy_proWWWThinkPHPSourceCodeAnalysiskakatestKaka.phpDie von uns definierte Datei. $fallbackDirsPsr4属性里边返回的file

    ThinkPHP lädt automatisch die Loader-Quellcodeanalyse然后就是使用__include_file来直接includeD:phpstudy_proWWWThinkPHPSourceCodeAnalysiskakatestKaka.php我们定义的文件。

    以上的这个自定义文件如何实现类的自动加载,并且也就是extend

    Wie implementiert die obige benutzerdefinierte Datei das automatische Laden von Klassen? monospace; Wortumbruch: rgb(53, 148, 247); padding: 0px 2px; height: 21px; -height: 22px;">extend Lademethode

    4. Zusammenfassung

    Alle Prozesse des automatischen Klassenladens sind abgeschlossen. Sollten Fehler auftreten, können Sie diese im Kommentar hinterlassen Bereich !

    Beharrlichkeit beim Lernen, Beharrlichkeit beim Bloggen und Beharrlichkeit beim Teilen sind die Überzeugungen, die Kaka seit seiner Karriere immer vertreten hat. Ich hoffe, dass Kakas Artikel im riesigen Internet Ihnen ein wenig helfen können Kaka, wir sehen uns in der nächsten Ausgabe
🎜

Das obige ist der detaillierte Inhalt vonThinkPHP lädt automatisch die Loader-Quellcodeanalyse. 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