Heim >PHP-Framework >Denken Sie an PHP >Quellcode-Analyse der ThinkPHP-Fassade
"Dieser Artikel beschreibt hauptsächlich den Verwendungs- und Implementierungsprozess der Fassade und analysiert den Quellcode.
"
Partner, die das Framework verwenden, sollten wissen, dass das Framework ist neu in 5.1. Es wurde eine Funktion hinzugefügt, nämlich die Fassade, über die in diesem Artikel geschrieben wird, nämlich die Fassadenfunktion.
Jeder, der diese Funktion verwendet hat, versteht den Vorteil, dass der Methodenaufruf direkt statisch aufgerufen werden kann, ohne dass das Schlüsselwort static zum Definieren verwendet werden muss.
Als nächstes führt Sie Kaka dazu, die Geschichte der Fassade aus den folgenden Aspekten zu erkunden.
Ich habe bereits einen Artikel über das Laden von Konfigurationsdateien geschrieben und am Ende dieses Artikels mehrere Möglichkeiten erwähnt, Konfigurationsinformationen zu erhalten.
Eine der Methoden ist Config::get(). In diesem Artikel sollten Sie wissen, dass Sie bei der Verwendung von Config zum Abrufen von Konfigurationsinformationen zuerst use thinkfacadeConfig
,又因为在系统中注册了别名,所以直接使用use Config
einführen müssen.
Obwohl wir __callStatic
Methode. use thinkfacadeConfig
,但是实际调用的方法却是thinkphp/library/think/Facade.php
中的__callStatic
方法。
然后会执行同文件的createFacade
方法。
虽说现在还没有看源码,看着知道就好了,在调用createFacade
方法时是直接从容器类里边获取的。
在学习容器时我们都知道容器是使用了注册树模式,需要使用对应对象实例的时候就可以直接获取,这样就避免了一个类反复的创建。这就是其中的一个优点。利用容器的特性
对于以前使用config来说,需要使用config的命名空间,然后进行实例化才能进行调用。
如果此时config不让使用了,需要使用自己创建的config类,如果没有使用门面模式,就需要修改大量的代码,而且是全局的。
但是如果使用了框架中的facade门面模式之后,你就只需要重写getFacadeClass
<span class="prefix" style="display: none;">Obwohl ich mir den Quellcode noch nicht angesehen habe, ist es gut, ihn nach dem Betrachten zu kennen. Beim Aufruf von <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; Randradius: 0 2px; Hintergrundfarbe: rgba(27,31,35,.05); all; color: rgb(271, 93, 108);">createFacade
-Methode wird direkt von der Containerklasse abgerufen. Beim Lernen von Containern wissen wir alle, dass Container den Registrierungsbaummodus verwenden. Wenn Sie die entsprechende Objektinstanz verwenden müssen, können Sie diese direkt abrufen und so die wiederholte Erstellung einer Klasse vermeiden. Das ist einer der Vorteile. Nutzen Sie die Eigenschaften des ContainersFür die vorherige Verwendung von config müssen Sie den Namespace von config verwenden und ihn dann instanziieren, bevor Sie ihn aufrufen. Wenn die Konfiguration derzeit nicht verwendet werden darf, müssen Sie die von Ihnen erstellte Konfigurationsklasse verwenden. Wenn Sie den Fassadenmodus nicht verwenden, müssen Sie viel Code ändern, und dieser ist global. Aber wenn Sie den Fassadenmodus im Framework verwenden, müssen Sie nur getFacadeClass
Diese Methode reicht aus. Sie müssen nur das Rückgabeergebnis ändern oder es selbst definieren, da es ihnen egal ist, was die Instanz aufruft, wenn andere Dateien sie aufrufen, sondern nur das Methode benennen und Ergebnisse zurückgeben. 🎜🎜🎜 2. Die Verwendung von Fassade im Lernrahmen 🎜🎜🎜🎜🎜Erstellen Sie zunächst eine Controller-Fassade und schreiben Sie den folgenden Inhalt. 🎜🎜Hier verwenden wir einfach die Fassadenmethode, um Informationen zur Konfigurationsdatei zu erhalten. 🎜Sie können hier sehen, dass use Config , das ist der Alias der Konfigurationsklasse. <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31,35,.05); font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">use Config
,这个就是config类的别名。
别名的设置是在base.php
3. Optimieren Sie die Verwendung von Fassaden im Framework
Oben haben wir die gleiche Funktion von der Instanziierung von Klassen bis zur Verwendung von Fassaden implementiert.
Obwohl der gewünschte Effekt angezeigt wird, ist der Code immer noch nicht prägnant und schön genug und die Struktur ist relativ verwirrend.
Als nächstes wird Kaka Ihnen einen realisierbaren Plan vorlegen. Wenn Sie andere Pläne haben, können Sie diese vorschlagen! Wir sehen uns im Kommentarbereich.
Bei der normalen Entwicklungsarbeit ist es unmöglich, nur eine oder mehrere maßgeschneiderte Fassadenklassen zu haben. Bei komplexen Projekten wird es viele Fassadenklassen geben.
Da es viele gibt, müssen sie verwaltet werden.
Erstellen Sie zunächst eine zur Fassade gehörende Konfigurationsklasse.
Ordnen Sie die Proxy-Klasse der tatsächlichen Klasse zu und legen Sie dann den Alias fest.
Zu diesem Zeitpunkt müssen Sie eine Hook-Datei erstellen und die Registrierung der Fassadenklasse und des Namens der Fassadenkategorie zur Ausführung darin ablegen.
Der letzte Schritt besteht darin, dass die Hook-Datei erstellt, aber nicht ausgeführt wird.
Wann sollte die Hook-Datei ausgeführt werden? Das heißt, es wird geladen, wenn die Anwendung initialisiert wird.
Die in TP5.1 angewendete Anfangskonfiguration ist in 在应用初始化的配置项里把钩子文件配置进去即可。
测试
最后一步就是测试了,依然是执行application/index/controller/Facade.php
文件中的getUserInfo
Konfigurieren Sie einfach die Hook-Datei im Konfigurationselement für die Anwendungsinitialisierung.
TestDer letzte Schritt besteht darin, <code style="font-size: 14px; word-wrap: break-word; border-radius: in der Datei application/index/controller/Facade.php 4px; Rand: 0 2px; Hintergrundfarbe: rgba(27,31,35,.05); 271, 93, 108);">getUserInfo
-Methode.
Anhand der Testergebnisse können wir wissen, dass es kein Problem beim Schreiben des Codes unserer Lösung gibt. 🎜🎜Haben Sie hier ein Problem gefunden, das heißt, der Alias der Fassadenklasse ist im Hook definiert, wird hier aber nicht verwendet? 🎜🎜Als nächstes verwenden wir Aliase, um es zu testen. 🎜
Bevor Sie den Quellcode analysieren, lernen Sie zunächst zwei Methoden kennen.
__callStatic
: Wenn der Zugriff erfolgt ist nicht Diese Methode wird aufgerufen, wenn eine statische Methode vorhanden ist. __callStatic
:当访问不存在的静态方法时,会调用此方法。call_user_func_array
:可以直接用此函数来直接调用函数。我们就从获取配置文件开始解析
执行Config::get('facade.');
会执行到文件thinkphp/library/think/facade/Config.php
中。
在这个文件中就是之前说的,如果存在getFacadeClass
call_user_func_array; Code>: Mit dieser Funktion können Sie die Funktion direkt aufrufen. <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">Wir beginnen mit dem Parsen, indem wir die Konfigurationsdatei abrufen</p>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"><img src="https://img.php.cn/upload/image/251/782/813/1604644009462115%20.png" alt="Quellcode-Analyse der ThinkPHP-Fassade" style="max-width:90%"> Execute<code style="font-size: 14px; Zeilenumbruch: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31,35,. 05); Schriftfamilie: Operator Mono, Consolas, Monaco, Monospace: break-all;">Config::get('facade.'); wird in der Datei ausgeführt<code style="font-size: 14px; Zeilenumbruch: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba (27, 31,35, .05); Schriftfamilie: Operator Mono, Consolas, Monaco, Monospace; /think/ facade/Config.php
. 🎜Wenn in dieser Datei, wie bereits erwähnt, thinkphp/library/think/Facade.php
文件中的__callStatic
方法。
这个方法就是文章开头就直接说明的,访问不存在的静态的方法时则会调用此方法。
接着就会执行本类中的createFacade
这个方法
在这个方法里边有一行代码是这个样子的$facadeClass = static::getFacadeClass();
这段代码会在下文做详细的说明。
因为在子类中也有同样的方法,在本类中也有同样的方法但是在本类中的方法是没有任何返回值的。
这时你有没有一丝丝的困惑,这里使用的static到底会执行哪里的方法。或者这样想,为什么会执行子类的方法。
保留这些疑问将会在下文给你细细的讲来,先来把门面类的源码看完。
在这个方法中主要看我圈起来的几个地方。
第一处就是从子类的getFacadeClass
方法获取类的别名。
第二处是当子类没有getFacadeClass
$facadeClass = static::getFacadeClass();
Dieser Code wird unten ausführlich erläutert . 🎜🎜Weil es in Unterklassen dieselben Methoden und in dieser Klasse dieselben Methoden gibt, die Methoden in dieser Klasse jedoch keinen Rückgabewert haben. 🎜🎜Sind Sie derzeit etwas verwirrt darüber, welche Methode die hier verwendete statische Methode ausführen wird? Oder denken Sie so darüber nach, warum die Unterklassenmethode ausgeführt wird. 🎜🎜Behalten Sie diese Fragen und ich werde sie Ihnen unten im Detail erklären. Lesen wir zuerst den Quellcode der Fassadenklasse. 🎜🎜Schauen Sie sich bei dieser Methode hauptsächlich die wenigen Orte an, die ich umkreist habe. 🎜🎜Das erste ist die Unterklasse von getFacadeClass code> Methode ruft den Alias der Klasse ab. 🎜🎜Die zweite Sache ist, wenn die Unterklasse nicht über <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color" verf : rgba schriftfamilie: operator mono consolas monaco monospace: break-all>getFacadeClass code>-Methode, die aus manuell gebundenen Eigenschaften abgerufen wird. 🎜🎜Der dritte Teil ist der im vorherigen Artikel erwähnte Container. Ich werde ihn hier nicht im Detail erklären. Wenn Sie nicht wissen, wie, klicken Sie auf die Homepage, um den vorherigen Artikel zu lesen. 🎜<figure data-tool="mdnice编辑器" style="margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center; border-radius: 16px; overflow: hidden;"><img src="https://img.php.cn/upload/image/181/259/937/1604644075360708.png" alt="Quellcode-Analyse der ThinkPHP-Fassade" style="max-width:90%" title="1604644075360708.png"><figcaption style="margin-top: 5px; text-align: center; color: rgb(136, 136, 136); font-size: 12px;">createFacade-Methode</figcaption></figure><h1 data-tool="mdnice编辑器" style="margin-top: 30px; margin-bottom: 15px; padding: 0px; color: black; border-top: 2px solid rgb(248, 57, 41); text-align: center; font-size: 1.3em;">
<span class="prefix" style="display: none;"></span><span class="content" style="display: inline-block; font-weight: normal; background: rgb(248, 57, 41); color: #ffffff; padding: 3px 10px 1px; border-radius: 0 0 13px 13px;"> 5. statisches Schlüsselwort </span><span class="suffix"></span>
</h1>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">Ich muss hier das statische Schlüsselwort erklären. </p>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">Neue Lernende wissen wahrscheinlich nur, dass Static zum Definieren statischer Variablen und statischer Methoden verwendet wird. </p>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">Natürlich werde ich Ihnen hier nicht erklären, wie man statische Methoden und statische Variablen definiert, aber ich werde auf ein sehr, sehr kleines Detail eingehen. </p>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">Schauen wir uns zunächst ein Beispiel an. Dieses Beispiel wurde auch von Kaka basierend auf dem Fassaden-Quellcode beim Lesen des Fassaden-Quellcodes angepasst. </p>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">Kaka Hier wurden zwei neue Dateien erstellt, nämlich test und test1. </p>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">test erbt die test1-Datei und beide haben die gleiche Methode getKaka. </p>
<figure data-tool="mdnice编辑器" style="margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center; border-radius: 16px; overflow: hidden;"><img src="https://img.php.cn/upload/image/738/351/932/1604644093440177.png" alt="Quellcode-Analyse der ThinkPHP-Fassade" style="max-width:90%" title="1604644093440177.png"><figcaption style="margin-top: 5px; text-align: center; color: rgb(136, 136, 136); font-size: 12px;">Erstellen Sie zwei neue Dateien.</figcaption></figure><p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"><span style="font-weight: 700; color: rgb(248, 57, 41);">Quellcode testen.</span></p>
<figure data-tool="mdnice编辑器" style="margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center; border-radius: 16px; overflow: hidden;"><img src="https://img.php.cn/upload/image/560/656/885/1604644111681194.png" alt="Quellcode-Analyse der ThinkPHP-Fassade" style="max-width:90%" title="1604644111681194.png"><figcaption style="margin-top: 5px; text-align: center; color: rgb(136, 136, 136); font-size: 12px;">Quellcode testen<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"><img src="https://img.php.cn/upload/image/941/520/842/1604644143486510.png" alt="Quellcode-Analyse der ThinkPHP-Fassade" style="max-width:90%" title="1604644143486510.png"><span style="font-weight: 700; color: rgb(248, 57, 41);">Ergebnisse drucken</span><img src="https://img.php.cn/upload/image/554/604/977/1604644262402387.png" alt="Quellcode-Analyse der ThinkPHP-Fassade" style="max-width:90%" title="1604644262402387.png">Sind Sie derzeit etwas verwirrt? Wie drucke ich es aus? 4px; Rand: rgba(27,31,35,.05); 271 , 93, 108);">147</p></figcaption></figure>
statt 456
ist da!的 Ändern Sie den Code von TEST1 und ändern Sie die Statik in self. png" style="border-radius: 6px; display: block; margin-width: 95%; object-fit: include;" title="1604644161626306.png"/>Ergebnisse drucken147
,而不是456
呢!
修改test1的代码,把static改为self
打印结果
使用self的代码相信大家都看的明白,那为什么使用static就出现了有可能不太明白的结果呢!
此时就是文档开始起作用了,但是当你打开PHP文档会发现,在static这一篇中并没有对这类情况作出说明。
经过咔咔多次测试和查阅资料,最终总结结果如下。
static::$test 如果有被继承的话 默认调用子类 ,否则调用的是自身
self::$test 如果有被继承的话,默认调用本类
放在本实例中来说明就是,当test继承test1时。
在test1中使用static调用方法getKaka
时,默认调用的是test类中的getKaka
getKaka
, der Standardaufruf ist Verwenden Sie self, um die Methode in test1 aufzurufen. 27 ,31,35,.05); Schriftfamilie: Operator Mono, Consolas, Menlo, monospace; > , der Standardaufruf ist <code style="font-size: 14px; Zeilenumbruch: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba (27,31 ,35,.05); Schriftfamilie: Operator Mono, Consolas, Monaco, Monospace; ist die Methode dieser Klasse. <code style=" font-size: word-wrap: break-word padding: border-radius: margin: background-color: rgba font-family: operator mono consolas monaco menlo monospace word-break: break-all color: rgb>getKaka
时,默认调用的是test1类中的getKaka
,也就是本类的方法。这个小小的细节也是咔咔无意中发现的,如果有什么不对的地方可以提出来,咔咔作出修改。
因为在继承这方面还有另外一种情况,咔咔私下会进行测试,在这里就不说明了。
这里对这个static做出解释主要是为了解释thinkphp/library/think/Facade.php