Heim >
PHP-Framework >
Denken Sie an PHP >
Denken Sie bei PHP über den Unterschied zwischen ArrayAccess und der Direct Magic Access Return-Instanz nach
Denken Sie bei PHP über den Unterschied zwischen ArrayAccess und der Direct Magic Access Return-Instanz nach
咔咔
Freigeben: 2020-12-30 09:01:30
Original
1777 Leute haben es durchsucht
"
In diesem Artikel wird der Controller als Primer instanziiert und dann der Unterschied zwischen ArrayAccess und der direkten Ausführung von magischem Zugriff zur Rückgabe der Instanz analysiert
"
Vorwort
Oben ein spezielles Detail Es wird eine Erläuterung des Routings gegeben, das ebenfalls mit der Initialisierung und Analyse der Anwendung beginnt, bis die Routenplanung zur Routenerkennung zurückkehrt.
Der durch die Routenerkennung erhaltene Wert ist wie unten dargestellt. Dies ist der Wert, der schließlich von der Routenplanung zurückgegeben wird.
Die verwendeten Routing-Regeln sind Route::get('hello/:name', 'index/index/:name');
wo gedruckt
Die Ergebnisse des Routing-Erkennungsdrucks
Wie Sie auf dem Bild oben sehen können, werden wichtige Daten im Versand gespeichert. Als nächstes wird der Controller im Detail erläutert.
Das erste, was erklärt werden muss, ist der Vorgang des Instanziierungscontrollers, der nach Abschluss der Routenerkennung ausgeführt wird.
1. Instanziierungscontroller
Werfen wir zunächst einen Blick darauf, wie der Instanziierungscontroller ausgeführt wird!
Es besteht kein Zweifel, dass der Code zuerst aus der Eintragsdatei ausgeführt werden muss. Hier wird der Container verwendet, um eine Instanz von App zurückzugeben, und dann wird die Ausführungsmethode in der App-Klasse aufgerufen.
Die Eingabedatei
kommt zur Ausführungsanwendung. Bei dieser Methode ist es auch die Route, die gerade oben analysiert wurde.
Nachdem die Erkennungsroute ausgeführt wurde, wird der instanziierte Controller ausgeführt.
Führen Sie die Anwendung aus.
Nachdem die Routing-Erkennung abgeschlossen ist, wird Folgendes zurückgegeben: thinkroutedispatchModule Object这个类,并且这个类赋值给了变量$dispatch
Routing-Erkennung
Sehen Sie sich dann den Code dieser Methode an In diesem Kurzcode werden immer noch Abschlüsse verwendet. Wenn Sie sich über das Konzept der Abschlüsse nicht im Klaren sind, müssen Sie zu den Grundlagen zurückkehren.
Middleware
Der im Bild oben eingekreiste Ort ist $dispatch->run()Dieser Code wird als nächstes analysiert. $dispatch->run()这块代码,接下来就要对这块代码进行解析了。
Nachdem Sie den endgültigen Rückgabewert der Route überprüft haben, können Sie feststellen, dass diese Methode tatsächlich in thinkroutedispatchModule in dieser Klasse. 🎜🎜Dann müssen wir die Ausführungsmethode in dieser Klasse analysieren, die darin besteht, die Routing-Planung durchzuführen. 🎜🎜Bei dieser Methode werden weder Routing-Parameter abgerufen noch Routing-Erkennungen noch eine automatische Datenüberprüfung durchgeführt (die oben angegebene Routing-Adresse dient als Beispiel). 🎜
🎜 🎜🎜Routing-Planung ausführen🎜🎜🎜Also wird es gemäß dem obigen Code ausgeführt, um $data = $this->exec();here. 🎜
Die Verfolgung dieser Methode führt zur Existenz einer abstrakten Klasse im Bild unten. Was Sie hier wissen müssen, ist die abstrakte Klasse.
Abstrakte Klassen
Erklärung abstrakter Klassen
Abstrakte Klassen können nicht instanziiert werden
Klassen mit abstrakten Methoden müssen abstrakte Klassen sein; Klassen müssen mit abstrakten Klassen dekoriert sein
Abstrakt Methoden können keinen Funktionskörper haben. Das heißt, abstrakte Funktionen fun(); Alle abstrakten Methoden
Abstrakte Unterklassen erben abstrakte Klassen, ohne die abstrakten Methoden der übergeordneten Klassen zu erben
Gemäß dem Prinzip des Bildes oben können Sie sehenDiese Klasse ist eine abstrakte Klasse.
Es wird also zwei Situationen geben: Die abstrakte Klasse erbt die abstrakte Klasse, ohne die abstrakte Methode der übergeordneten Klasse zu erben. Das andere ist, dass eine nicht abstrakte Unterklasse eine abstrakte Klasse erbt und die Unterklasse alle abstrakten Methoden der übergeordneten Klasse implementieren muss.
Abstrakte Klasse
So finden Sie heraus, wer Dispatch geerbt hat
Zu diesem Zeitpunkt haben Sie eine Frage dazu, wie Sie die Unterklasse von Dispatch finden.
Auf diesem Bild sehen Sie diese Versandart, es gibt aber auch ein Versandverzeichnis.
Anhand der von der Routenerkennung zurückgegebenen Daten können Sie leicht erkennen, dass es sich um thinkphp/library/think/route/dispatch/Module.phpDiese Klasse. thinkphp/library/think/route/dispatch/Module.php这个类。
🎜🎜🎜 Auf der Suche nach Unterklassen 🎜🎜🎜 kommt zu exec-Methode. 🎜
Dann besteht die nächste Aufgabe darin, diese Methode ausführlich zu erklären.
Instanziieren Sie den Controller
Schauen Sie sich zuerst die erste Codezeile an$this->app['hook']->listen('module_init');, hier wird der Container ArrayAccess verwendet, um auf das Objekt in Form eines Arrays zuzugreifen und dann die Magie ausführen Die Methode __get führt die make-Methode aus, wenn auf eine nicht vorhandene Eigenschaft zugegriffen wird. $this->app['hook']->listen('module_init');,在这里使用了容器ArrayAccess用数组的形式访问对象,然后执行的魔术方法__get,当访问不存在的属性时会去执行make方法。
Verwenden Sie den Editor, um diese App zu verfolgen, und Sie werden Folgendes sehen: Suchen Sie nach der Instanziierung der App-KlasseWenn Sie dann zur App-Klasse kommen, können Sie sehen, dass sie von der Container-Klasse geerbt wird.
🎜Geerbte Klassen
Ich habe über diesen Wissenspunkt im Zusammenhang mit Containern mehr als einmal gesprochen. Um auf nicht vorhandene Eigenschaften zuzugreifen, gehen Sie zurück und führen Sie die magische Methode __get des Containers aus.
Die magische Methode wird ausgeführt, wenn auf nicht vorhandene Eigenschaften zugegriffen wird. Die Parameter dieses Blocks werden also an den Hook übergeben und die Instanz des Hooks wird zurückgegeben Im Abschnitt über den Container ist es sehr detailliert, Sie können es sich ansehen!
Die Instanz des Hooks zurückgeben
Dann wird die Listen-Methode des Hooks ausgeführt, um das Verhalten des Tags zu überwachen.
Hören Sie sich das Verhalten des Tags an
Zu diesem Zeitpunkt können Sie zur Definitionsdatei für die Anwendungsverhaltenserweiterung gelangen. Sie können sehen, dass dieser Parameter für das Modul initialisiert ist, dieser Wert jedoch leer ist.
Da es im obigen Bild nicht ausgeführt wird, geben Sie für einen einfachen Test den Anwendungsinitialisierungswert in diesen Parameter ein.
Diese Klasse ist der Ausführungs-Hook, der die Fassadenklasse optimiert.
Verhaltenserweiterungsdefinitionsdatei anwenden
Dann wird der Code ausgeführt, um$results[$key] = $this->execTag($name, $tag, $params);Hier. $results[$key] = $this->execTag($name, $tag, $params);这里来。
参数说明
$name = string(22) "behaviorLoadBehavior"
$tag = module_init
接着通过正则对传过来的参数进行处理,最终返回moduleInit
然后通过$obj = Container::get($class);
Parameterbeschreibung🎜
name = string(22) "behaviorLoadBehavior"
$tag = module_init
🎜Dann werden die übergebenen Parameter durch reguläre Ausdrücke verarbeitet und schließlich wird moduleInit zurückgegeben🎜🎜Dann ByEndlich bestanden 0.05); Schriftfamilie: „Operator Mono“, Consolas, Monaco, Monospace; Wortumbruch: break-all;“>is_callableDiese Funktion wird verwendet Stellen Sie zur Überprüfung fest, ob die Methode in der Klasse aufgerufen werden kann, im Array-Format der Methode. Diese Methode schreibt später einen separaten Artikel als zu analysierendes Objekt. Hier müssen Sie nur wissen, dass sie false zurückgibt. is_callable这个函数进行验证,检测类里边的方法是否可以被调用,方法数组格式,这个方法后期咔咔单独写一篇文章作为对象来解析,这里只需要知道会返回false即可。
Dann ist der Instanziieren Sie den Controller🎜🎜Der nächste Schritt besteht darin, den Controller zu instanziieren. Die aufrufende Methode ist$this->app->controller()🎜
Was hier beachtet werden muss, ist die Listenfunktion. Diese Funktion gibt ein Array zurück, und dann sind die beiden Variablen in der Liste die Indizes 0 und 1.
Das Urteil führt auch die erste aus und führt auch die Make-Methode der Containerklasse aus. Diese Methode gibt direkt eine Instanz dieser Klasse zurück. appindexcontrollerIndex
2. In Bezug auf den Unterschied zwischen ArrayAccess und der direkten Ausführung von magischem Zugriff auf Rückgabeinstanzen
Einige Freunde Habe es bereits gelernt die Verwendung von ArrayAccess und der magischen Methode __get. Es wird geschätzt, dass einige von ihnen an diesen beiden Stellen nicht eindeutig sind. Kaka wird diese beiden zusammenfügen und analysieren.
Lass uns zuerst über die Verwendung von ArrayAccess sprechen
Dieser Fall wurde Ihnen bereits demonstriert, hauptsächlich zur Implementierung der ArrayAccess-Klasse.
Dies ist eine zuvor geschriebene Testmethode
Wenn es dann um den zu verwendenden Controller geht, wird er zuerst instanziiert. Der zuvor implementierte Fall ist wie folgt.
Aber der Fall, der dieses Mal umgesetzt werden muss, ist nicht der, der im Bild unten umgesetzt wird.
Verwenden Sie den Controller
Als nächstes verwenden Sie die in der Abbildung unten gezeigte Methode, um über ein Array direkt auf die Objekteigenschaften zuzugreifen.
Im Bild oben sehen Sie, dass ein Attributtitel auf kaka gesetzt ist. In diesem Fall kann er direkt in Form eines Arrays abgerufen werden.
Beachten Sie, dass das Rückgabeergebnis Kaka ist, was bedeutet, dass auf die Eigenschaften des Objekts direkt in Array-Form zugegriffen wird.
Neuer Besuch Besuch
Ergebnisse drucken
Zusammenfassung
Im Implementierungsprozess des ersten Falls wurde ein Schritt ignoriert, nämlich die Verwendung des Objekts, um direkt auf die Eigenschaften des Objekts in Form eines Arrays zuzugreifen.
Was Sie sehen können, können Sie direkt erhalten. Lassen Sie uns diese Idee in den Rahmen einbauen und einen Blick darauf werfen.
Framework-Praxisfall
Der folgende Code existiert in der im vorherigen Artikel analysierten Route.
Routing-Klasse
Werfen wir zunächst einen Blick auf den Wert dieser App, die als thinkApp Object-Objekt gedruckt wird.
Der gedruckte App-Wert
ist thinkApp Object这个对象去访问request时,因为app属性就没有这个request. Da die App-Klasse die Containerklasse erbt, wird sie zur Containerklasse weitergeleitet, um die Methode in der folgenden Abbildung auszuführen.
Führen Sie diese Methode aus
Dann wird die __get-Methode ausgeführt und die make-Methode wird ausgeführt, um die entsprechende Instanz zurückzugeben.
Führen Sie diese Methode aus, um das Instanzobjekt zurückzugeben
Wenn Sie zu diesem Zeitpunkt noch Fragen haben, warum wird sie einfach ausgeführt, wenn sie angibt, dass sie ausgeführt wird?
Als nächstes führt Kaka Sie durch einen einfachen Test, um das herauszufinden.
Drucken Sie an dieser Position einen zufälligen Wert.
Testfall
Gehen Sie dann zur offsetGet-Methode von ArrayAccess der Containerklasse und drucken Sie den übergebenen Wert aus.
Schauen Sie sich die gedruckten Ergebnisse an und es wird sehr klar sein.
Hier Bildbeschreibung einfügen
Ergebnisse drucken
Dies ist auch eine detaillierte Erklärung, die auf der vorherigen basiert. Geben Sie eine detaillierte Erklärung der __get-Methode im Container und sehen Sie, unter welchen Umständen die __get-Methode ausgeführt wird.
Detaillierte Erklärung zur Verwendung der __get-Methode
Wenn das System also darauf zugreift, führt es die magische Methode der Containerklasse aus, da die App-Klasse nicht über das Hook-Attribut verfügt. $this->hook
Magische MethodeFühren Sie dann die make-Methode aus, um eine Instanz der Klasse zu erstellen.
Erstellen Sie eine Instanz einer Klasse
Zusammenfassung
Wir verwenden also die Methoden ArrayAccess und __get magic, und letztendlich gibt die ausgeführte make-Methode eine Instanz der Klasse zurück. Wenn Sie auf this->config stoßen, wird die __get-Methode des Containers ausgeführt. Wenn Sie auf app['request'] stoßen, führen Sie ArrayAccess und dann offsetGet aus
__get gilt für die Attribute der Klasse.
ArrayAccess wird ausgeführt wenn es nicht existiert offsetGetEmpfohlenes Tutorial: „thinkphp“
Das obige ist der detaillierte Inhalt vonDenken Sie bei PHP über den Unterschied zwischen ArrayAccess und der Direct Magic Access Return-Instanz nach. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
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