Heim > Artikel > PHP-Framework > ThinkPHP lädt automatisch die Loader-Quellcodeanalyse
❝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.
❞
Wir arbeiten derzeit an der PHP-Advanced-Roadmap, wenn es gute Vorschläge gibt, wird Kaka diese so schnell wie möglich aufnehmen.
Kommen 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.
Ab hier beginnt das Laden der Composer-Datei, der Vorgang ist ebenfalls sehr einfach
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:>$
符号。从而在self::${$attr} = $composerClass::${$attr};
,这里的$attr
就是'prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files'
这些数据,外层在加一个$
符号。
从而在ComposerStaticInit30742487e00917c888d89ba216f165b9
Datei oder thinkphplibrarythinkLoader.php
'sregister
method thinkphplibrarythinkLoader.php
的register
方法
在这里注册了俩个命令空间,分别为think和traits。然后会进入到addNamespace这个方法中在addNamespace
方法中,添加了Psr4空间
addNamespace -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 ComposerStaticInit1e269472f484e157e90227b420ffca7a
ComposerStaticInit1e269472f484e157e90227b420ffca7a类的$prefixLengthsPsr4和$prefixDirsPsr4这俩个属性中
为了验证上面做一个断点调试,看到这些数据就应该清晰了,至于traits
也是一样的注册方式。
截止到这里命名空间就注册完成了,接下来研究一下psr4命名空间是个什么东东。
psr是简单的理解就是文件路径、自动加载对应类的相关规范、目前TP5.1使用的是psr4规范
此处的类是指class、接口、超类结构
一个完整的类需要一下结构()*
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 .
An diesem Punkt wird es definitiv eine Frage geben: Warum gibt es hier keine classmap.php-Datei? Keine Eile, keine Panik, führen Sie es einfach zuerst ausphp think optimize:autoload
把文件弄出来最终会走到addClassMap
这个方法,在这个方法中,只是把classmap.php
这个文件的数据赋值给$classMap
, es gibt keine andere Verwendung
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
这个方法进行加载的
在方法中也仅仅是把extend的路径赋值给了$fallbackDirsPsr4
这个属性。
截止到这里Loader::register();
Loader::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::autoload
Die erste nach dem Passieren Der Haltepunkt ist nicht geladen. Die Klasse ist thinkErrorWarum 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
可以简单的做个测试,将这Error改为Kaka,进行打印一下,这时的类就改变为Kaka。到这里大家对这个类的自动加载机制就有一定的了解了。
当使用的类没有被引入时会把这个类当做参数传到thinkphp/library/think/Loader.php
的autoload
Wenn 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.
Kommen 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
Gibt den vollständigen Pfad der thinkError-Klasse zurück zu autoload
s 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:>autoload
的file
变量后,把win环境的大小写给判断了一次。
然后直接使用include
引入文件即可,直到返回。
直到这里就是一次完整的类的自动加载解析。
虽然到这里结束了,但是还是得在提一点就是$classMap
这个属性,这个属性是基于文件classmap.php
来到,这个文件的生成也是需要执行命令php think optimize:autoload
生成的。
当没有生成这个文件时程序是如何执行的呢!
之前的所有流程都是一样的,只有在findFile
include
Importieren Sie einfach die Datei, bis sie zurückgegeben wird. Bis hierher erfolgt eine vollständige automatische Belastungsanalyse der Klasse. 🎜🎜$classMap
Dieses Attribut basiert auf der Dateiclassmap.php
ist hier. Die Generierung dieser Datei erfordert auch die Ausführung des Befehls php think activate:autoload
Generiert. 🎜🎜Wie wird das Programm ausgeführt, wenn diese Datei nicht generiert wird? 🎜🎜Alle vorherigen Prozesse sind gleich, nur in findFile
Das ist anders, lassen Sie es uns kurz klären. 🎜🎜Der Code wird derzeit definitiv nicht classMap folgen🎜Zuerst die thinkError-Datei abrufen
Dann den Namespace über die beiden Attribute beim automatischen Laden von Composer abrufen und dann die thinkError.php-Datei zusammenfügen
Das zurückgegebene Endergebnis ist auch D:phpstudy_proWWWThinkPHPSourceCodeAnalysisthinkphplibrarythinkError.php
diese Datei.
Der Code hier muss sorgfältig gelesen werden.
Das automatische Laden von Klassen ist hier komplett vorbei.
Erstellen Sie zunächst einen Ordner kaka
Fügen Sie dann die Datei Kaka.php
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?
Zu diesem Zeitpunkt wird die Bedeutung des Quellcodes deutlich. Denken Sie daran, register
-Funktion, das Erweiterungsverzeichnis wird geladenregister
函数中,加载过extend目录
这时在加一个kaka这个目录,直接进行访问一下
没毛病,直接就出来了。一切OK在这里在聊一下关于extent的加载方式
在之前聊注册自动加载类库目录只是说明了一下只是把路径存到了$fallbackDirsPsr4
$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🎜Solange die definierte Klasse eingegeben wird, wird sie zum automatischen Laden auf Autoload umgestellt
Es wird auch auf findFile
Diese MethodefindFile
这个方法
在findFile这个方法中可以看到这段代码,这个属性是不是很熟悉,就是自动加载extend目录时添加到$fallbackDirsPsr4
属性的。
当在findFile中打印参数class时看一下数据
很清楚地可以看到testKaka
testKaka
Diese Klasse🎜Jetzt 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.php
Die von uns definierte Datei. $fallbackDirsPsr4
属性里边返回的file
然后就是使用__include_file
来直接includeD:phpstudy_proWWWThinkPHPSourceCodeAnalysiskakatestKaka.php
我们定义的文件。
以上的这个自定义文件如何实现类的自动加载,并且也就是extend
❝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!