Heim  >  Artikel  >  PHP-Framework  >  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

咔咔
咔咔Original
2020-12-29 11:31:491591Durchsuche
"

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');

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

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.

Denken Sie bei PHP über den Unterschied zwischen ArrayAccess und der Direct Magic Access Return-Instanz nach

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.

Denken Sie bei PHP über den Unterschied zwischen ArrayAccess und der Direct Magic Access Return-Instanz nach

Nachdem die Routing-Erkennung abgeschlossen ist, wird Folgendes zurückgegeben: thinkroutedispatchModule Object这个类,并且这个类赋值给了变量$dispatch

Denken Sie bei PHP über den Unterschied zwischen ArrayAccess und der Direct Magic Access Return-Instanz nach

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.

Denken Sie bei PHP über den Unterschied zwischen ArrayAccess und der Direct Magic Access Return-Instanz nach

Der im Bild oben eingekreiste Ort ist $dispatch->run()Dieser Code wird als nächstes analysiert. $dispatch->run()这块代码,接下来就要对这块代码进行解析了。

在检测路由最终的返回值可以知道其实这个方法是在thinkroutedispatchModule这个类中。

接着就需要对这个类中的run方法进行解析了,这个方法也就是执行路由调度。

在这个方法中不管是获取路由参数还是检测路由、数据自动验证都不会执行(是按照咔咔上文给的路由地址为案例)。

Denken Sie bei PHP über den Unterschied zwischen ArrayAccess und der Direct Magic Access Return-Instanz nach

所以根据上图代码就会执行到$data = $this->exec();

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

Denken Sie bei PHP über den Unterschied zwischen ArrayAccess und der Direct Magic Access Return-Instanz nach🎜 🎜🎜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.

Denken Sie bei PHP über den Unterschied zwischen ArrayAccess und der Direct Magic Access Return-Instanz nach

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 sehen
    Diese 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.
  • Denken Sie bei PHP über den Unterschied zwischen ArrayAccess und der Direct Magic Access Return-Instanz nach

    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这个类。

    Denken Sie bei PHP über den Unterschied zwischen ArrayAccess und der Direct Magic Access Return-Instanz nach

    来到thinkphp/library/think/route/dispatch/Module.php查看exec

    Denken Sie bei PHP über den Unterschied zwischen ArrayAccess und der Direct Magic Access Return-Instanz nach🎜🎜🎜 Auf der Suche nach Unterklassen 🎜🎜🎜 kommt zu exec-Methode. 🎜

    Dann besteht die nächste Aufgabe darin, diese Methode ausführlich zu erklären.

    Denken Sie bei PHP über den Unterschied zwischen ArrayAccess und der Direct Magic Access Return-Instanz nach

    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方法。

    使用编辑器追踪这个app会到thinkphp/library/think/route/Dispatch.php

    Verwenden Sie den Editor, um diese App zu verfolgen, und Sie werden Folgendes sehen:

    Wenn Sie dann zur App-Klasse kommen, können Sie sehen, dass sie von der Container-Klasse geerbt wird.

    Denken Sie bei PHP über den Unterschied zwischen ArrayAccess und der Direct Magic Access Return-Instanz nach

    🎜

    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.

    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 nachDie Instanz des Hooks zurückgeben

    Denken Sie bei PHP über den Unterschied zwischen ArrayAccess und der Direct Magic Access Return-Instanz nachHören Sie sich das Verhalten des Tags an

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!

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