Heim >PHP-Framework >Denken Sie an PHP >Quellcode-Analyse der ThinkPHP-Fassade

Quellcode-Analyse der ThinkPHP-Fassade

咔咔
咔咔Original
2020-11-05 12:02:372209Durchsuche
"

Dieser Artikel beschreibt hauptsächlich den Verwendungs- und Implementierungsprozess der Fassade und analysiert den Quellcode.

"

Vorwort

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.

1. Verstehen Sie kurz die Vorteile von Fassaden im Framework

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 __callStaticMethode. use thinkfacadeConfig,但是实际调用的方法却是thinkphp/library/think/Facade.php中的__callStatic方法。

然后会执行同文件的createFacade方法。

虽说现在还没有看源码,看着知道就好了,在调用createFacade方法时是直接从容器类里边获取的。

在学习容器时我们都知道容器是使用了注册树模式,需要使用对应对象实例的时候就可以直接获取,这样就避免了一个类反复的创建。这就是其中的一个优点。利用容器的特性

对于以前使用config来说,需要使用config的命名空间,然后进行实例化才能进行调用。

如果此时config不让使用了,需要使用自己创建的config类,如果没有使用门面模式,就需要修改大量的代码,而且是全局的。

但是如果使用了框架中的facade门面模式之后,你就只需要重写getFacadeClass

Dann wird der <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 getFacadeClassDiese 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. 🎜

Quellcode-Analyse der ThinkPHP-FassadeSie 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

Die Alias-Einstellungen sind in Quellcode-Analyse der ThinkPHP-FassadeQuellcode-Analyse der ThinkPHP-Fassade

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.

Quellcode-Analyse der ThinkPHP-FassadeErstellen 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.

Quellcode-Analyse der ThinkPHP-FassadeZu diesem Zeitpunkt müssen Sie eine Hook-Datei erstellen und die Registrierung der Fassadenklasse und des Namens der Fassadenkategorie zur Ausführung darin ablegen.

Quellcode-Analyse der ThinkPHP-FassadeDer 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 在应用初始化的配置项里把钩子文件配置进去即可。

Quellcode-Analyse der ThinkPHP-Fassade测试

最后一步就是测试了,依然是执行application/index/controller/Facade.php文件中的getUserInfo

Konfigurieren Sie einfach die Hook-Datei im Konfigurationselement für die Anwendungsinitialisierung.

Quellcode-Analyse der ThinkPHP-FassadeTest

Quellcode-Analyse der ThinkPHP-FassadeDer 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. Quellcode-Analyse der ThinkPHP-Fassade

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. 🎜

Quellcode-Analyse der ThinkPHP-FassadeQuellcode-Analyse der ThinkPHP-Fassade

4. Analyse des Quellcodes der Fassadenklasse

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:可以直接用此函数来直接调用函数。
  • 我们就从获取配置文件开始解析

    Quellcode-Analyse der ThinkPHP-Fassade执行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方法。

    这个方法就是文章开头就直接说明的,访问不存在的静态的方法时则会调用此方法。

    Quellcode-Analyse der ThinkPHP-Fassade接着就会执行本类中的createFacade这个方法

    在这个方法里边有一行代码是这个样子的$facadeClass = static::getFacadeClass();这段代码会在下文做详细的说明。

    因为在子类中也有同样的方法,在本类中也有同样的方法但是在本类中的方法是没有任何返回值的。

    这时你有没有一丝丝的困惑,这里使用的static到底会执行哪里的方法。或者这样想,为什么会执行子类的方法。

    保留这些疑问将会在下文给你细细的讲来,先来把门面类的源码看完。

    在这个方法中主要看我圈起来的几个地方。

    第一处就是从子类的getFacadeClass方法获取类的别名。

    第二处是当子类没有getFacadeClass

    Diese Methode wird direkt am Anfang des Artikels erklärt. Diese Methode wird aufgerufen, wenn auf eine nicht vorhandene statische Methode zugegriffen wird.

    Quellcode-Analyse der ThinkPHP-FassadecreateFacadeDiese Methode🎜🎜In dieser Methode gibt es eine Codezeile, die so aussieht$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

    Quellcode-Analyse der ThinkPHP-Fassade打印结果

    Quellcode-Analyse der ThinkPHP-Fassade使用self的代码相信大家都看的明白,那为什么使用static就出现了有可能不太明白的结果呢!

    此时就是文档开始起作用了,但是当你打开PHP文档会发现,在static这一篇中并没有对这类情况作出说明。

    经过咔咔多次测试和查阅资料,最终总结结果如下。

    static::$test  如果有被继承的话 默认调用子类 ,否则调用的是自身

    self::$test    如果有被继承的话,默认调用本类

    放在本实例中来说明就是,当test继承test1时。

    在test1中使用static调用方法getKaka时,默认调用的是test类中的getKaka

    ="https://img.php.cn/upload/image/368/436/992/1604644180483067.png" alt="Quellcode-Analyse der ThinkPHP-Fassade" style="border-radius: 6px; display: block; margin: 20px auto ; max-width: 95%; object-fit: include;" title="1604644180483067.png"/>Ich glaube, dass jeder den Code mit self verstehen kann. Warum erhält man also Ergebnisse, die bei Verwendung von static möglicherweise nicht klar sind? ! 🎜🎜An diesem Punkt beginnt das Dokument wirksam zu werden, aber wenn Sie das PHP-Dokument öffnen, werden Sie feststellen, dass es im statischen Artikel keine Erklärung für diese Art von Situation gibt. 🎜🎜Nach vielen Tests und Datenüberprüfungen durch Kaka sind die endgültigen zusammenfassenden Ergebnisse wie folgt. 🎜🎜static::$test Wenn es geerbt ist, ruft es standardmäßig die Unterklasse auf, andernfalls ruft es sich selbst auf🎜🎜self::$test Wenn es geerbt ist, ruft es standardmäßig diese Klasse auf🎜🎜Es wird erklärt In diesem Beispiel erbt test test1. 🎜🎜Verwenden Sie die statische Aufrufmethode in test1getKaka , 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

    Dieses kleine Detail wurde auch von Kaka zufällig entdeckt. Wenn etwas nicht stimmt, können Sie es darauf hinweisen und Kaka wird Änderungen vornehmen.

    Da es bei der Vererbung eine andere Situation gibt, wird Kaka es privat testen, daher werde ich es hier nicht erklären.
    Quellcode-Analyse der ThinkPHP-FassadeDie statische Erklärung hier dient hauptsächlich der Erläuterung von thinkphp/library/think/Facade.php

    6. Zusammenfassung

    Quellcode-Analyse der ThinkPHP-Fassade

    Nehmen wir zunächst ein Fassadenflussdiagramm, um den spezifischen Ausführungsprozess der Fassadenklasse klarer zu sehen.

    Der Quellcode der Fassadenklasse ist sehr einfach, bis auf ein paar ungewöhnliche Wissenspunkte glaube ich, dass jeder den Code verstehen kann.

    Dies dient hauptsächlich dazu, nach dem Lesen der Kategorie Fassade eine kurze Zusammenfassung zu erstellen. 🎜🎜Die Fassadenklasse ist hauptsächlich eine Funktion, die in Kombination mit dem Container implementiert wird, da der Container benötigt wird, um die entsprechende Instanz zurückzugeben. Wenn Sie mit dem Container nicht vertraut sind, können Sie ihn lesen entsprechender Artikel am Anfang des Artikels. 🎜🎜Dieser Artikel stellt die Verwendung von Fassaden in Containern vor und zeigt Ihnen die optimale Verwendungsweise. Die beste Möglichkeit ist hier Kakas persönliche Meinung, da Kaka diese Methode seit fast zwei Jahren verwendet. 🎜

    Es ist sehr praktisch in Bezug auf Code-Robustheit und Skalierbarkeit.

    Dann möchte ich zum Schlüsselwort static allen etwas Unpopuläres hinzufügen. Wenn eine Klasse eine Klasse erbt und das Schlüsselwort static in der übergeordneten Klasse verwendet wird, wird standardmäßig die Methode der Unterklasse aufgerufen.

    Die Zusammenfassung hier gilt nur für die Beispiele in diesem Artikel.

    Eigentlich möchte Kaka dir hier einen Punkt erklären: return call_user_func_array([static::createFacade(), $method], $params);

    因为在以前的用法的哥参数就直接是方法,但是在这里碰到了数组形式,那么这个数组中的俩个值都代表的是什么呢!

    第一个值为实例,第二个值为实例中的方法。

    关于call_user_func_array

    Weil die Parameter in der vorherigen Verwendung direkt Methoden waren, aber hier sind wir auf die Array-Form gestoßen, dann dies Was tun? zwei Werte im Array darstellen?

    Der erste Wert ist die Instanz und der zweite Wert ist die Methode in der Instanz.

    Aboutcall_user_func_arrayDie Verwendung dieser Methode Wenn Sie auf „Ich werde Ihnen den Fall hier nicht zeigen“ klicken, müssen Sie nur wissen, dass die eingehende Methode ausgeführt wird.
    Damit ist die Quellcode-Analyse der Fassade beendet. Das Wichtigste ist, den Container zu verstehen, denn die Fassade wird auf Basis des Containers implementiert, weshalb Kaka zuerst den Container und dann die Fassade schreibt.

    Außerdem hat Kaka auch einen Plan für die Nutzung der Fassade vorgelegt. Wenn Sie einen besseren Plan haben, können Sie im Kommentarbereich eine allgemeine Idee abgeben.

    Beharrlichkeit beim Lernen, Beharrlichkeit beim Bloggen und Beharrlichkeit beim Teilen sind die Überzeugungen, die Kaka seit seiner Karriere vertritt. 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 vonQuellcode-Analyse der ThinkPHP-Fassade. 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