Heim >PHP-Framework >Denken Sie an PHP >Denken Sie bei PHP über den Unterschied zwischen ArrayAccess und der Direct Magic Access Return-Instanz nach
"In diesem Artikel wird die Instanziierung des Controllers vorgestellt und anschließend der Unterschied zwischen ArrayAccess und der direkten Ausführung von magischem Zugriff zur Rückgabe der Instanz analysiert
"
Im Im obigen Artikel wird das Routing besprochen. Die spezielle detaillierte Erklärung beginnt auch bei der Anwendungsinitialisierung und -analyse, 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');
Wie Sie auf dem Bild oben sehen können, werden wichtige Daten in Dispatchc gespeichert und dann erfolgt die Steuerung Das Gerät wird ausführlich erklärt.
Das erste, was erklärt werden muss, ist der Vorgang des Instanziierungscontrollers, der nach Abschluss der Routenerkennung ausgeführt wird.
Schauen wir uns zunächst an, 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.
kommt zur Ausführungsanwendung. Bei dieser Methode wird auch die gerade oben analysierte Route verwendet.
Nachdem die Erkennungsroute ausgeführt wurde, wird der instanziierte Controller ausgeführt.
Nach Abschluss der Routing-Erkennung erfolgt die Rückkehr thinkroutedispatchModule Object
这个类,并且这个类赋值给了变量$dispatch
Dann schauen Sie sich diesen Code dieser Methode an. Hier wird Middleware verwendet. Hier ist die Kurzfassung Code-Abschlüsse werden immer noch verwendet. Wenn Sie sich über das Konzept der Abschlüsse nicht im Klaren sind, müssen Sie zu den Grundlagen zurückkehren.
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();
thinkroutedispatchModule
in dieser Klasse. Dann müssen wir die Ausführungsmethode in dieser Klasse analysieren, die darin besteht, die Routing-Planung durchzuführen. Routing-Planung ausführenDer Code wird also gemäß dem obigen Code ausgeführt: $data = $this->exec();
here.
aus der übergeordneten Klasse kann nach dem Prinzip des obigen Bildes gesehen werdenDispatch
Diese Klasse ist eine abstrakte Klasse. Dispatch
这个类是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继承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,子类必须实现父类的所有抽象方法。
怎么去找谁继承了Dispatch
这个时候是不是有一个疑问就是怎么去找Dispatch的子类。
在这个图中可以看到本类Dispatch,但是还有一个dispatch这个目录。
根据Denken Sie bei PHP über den Unterschied zwischen ArrayAccess und der Direct Magic Access Return-Instanz nach返回的数据可以轻而易举的就知道是thinkphp/library/think/route/dispatch/Module.php
thinkphp/library/think/route/dispatch/Module.php
Diese Klasse. 🎜 kam zu thinkphp/ Library/think/route/dispatch/Module.php
Viewexec
-Methode. thinkphp/library/think/route/dispatch/Module.php
查看exec
方法。
那么接下来的任务就是对这个方法进行深入的解读了。
先看第一行代码$this->app['hook']->listen('module_init');
,在这里使用了容器ArrayAccess用数组的形式访问对象,然后执行的Denken Sie bei PHP über den Unterschied zwischen ArrayAccess und der Direct Magic Access Return-Instanz nach__get,当访问不存在的属性时会去执行make方法。
使用编辑器追踪这个app会到thinkphp/library/think/route/Dispatch.php
Schauen Sie sich zuerst die erste Codezeile an$this->app['hook']->listen('module_init');
, hier verwendet der Container ArrayAccess ein Array Access the Objekt im Formular und führen Sie dann die magische Methode __get aus. Beim Zugriff auf ein nicht vorhandenes Attribut wird die make-Methode ausgeführt.
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.
Daher werden die Parameter dieses Blocks an den Hook übergeben und die Instanz des Hooks zurückgegeben. Wie diese Instanz zurückgegeben wird, wird erläutert Der Abschnitt über Container ist ausführlich, Sie können einen Blick darauf werfen!
Dann wird die Listen-Methode des Hooks ausgeführt, um das Verhalten des Tags zu überwachen.
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.
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);
返回behaviorLoadBehavior的实例
最终通过is_callable
这个函数进行验证,检测类里边的方法是否可以被调用,方法数组格式,这个方法后期咔咔单独写一篇文章作为对象来解析,这里只需要知道会返回false即可。
然后会把本类的$portal
这个值赋值给$method
,这个值就是run。
最后通过$result = $this->app->invoke($call, [$params]);
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ückgegebenDann durch $obj = Container::get($class);
Gibt die Instanz von behaviorLoadBehavior zurück
Finally bestandenis_callable
Diese Funktion überprüft, ob die Methode in der Klasse aufgerufen werden kann. Methodenarray Format, nach dieser Methode schreibt Kaka einen separaten Artikel als zu analysierendes Objekt. Hier müssen Sie nur wissen, dass false zurückgegeben wird. 🎜🎜Dann wird der $portal
Dieser Wert ist zugewiesen aninvoke($call, [$params]);
Diese Codezeile, die unterste Ausführung dieser Codezeile, wird durch den Reflexionsmechanismus implementiert. 🎜🎜Der letzte Code gibt NULL zurück. 🎜🎜🎜Instanziierter Controller🎜🎜Der nächste Schritt besteht darin, den Controller zu instanziieren. Die aufrufende Methode ist $this->app->controller()
这里需要注意的是list这个函数,这个函数的后边会返回一个数组,然后list中的俩个变量会分别为索引0和1。
判断也会去执行第一个,同样会执行到容器类的make方法,这个方法会直接返回appindexcontrollerIndex
Was hier beachtet werden muss, ist die Listenfunktion. Nach dieser Funktion wird ein Array zurückgegeben, und dann werden die beiden Variablen in der Liste zurückgegeben Index 0 und 1. Instantiierung (geschichtetes) Controller-Format: [Modulname/] Controller-Name 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
Dies ist eine zuvor geschriebene Testmethode
Wenn Sie dann zum Controller kommen, um ihn zu verwenden, instanziieren Sie ihn zuerst. 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. 🎜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.
Zusammenfassung
Im Implementierungsprozess des ersten Falls wurde ein Schritt ignoriert, nämlich die Verwendung des Objekts, um direkt auf die Eigenschaften des Objekts zuzugreifen in Form eines Arrays.
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.
Werfen wir zunächst einen Blick auf den Wert dieser App im gedruckten Zustand: thinkApp Object
object. thinkApp Object
对象。
当thinkApp Object
这个对象去访问request
时,因为app属性就没有这个request
Zugriff auf dieses Objektrequest
, da das app-Attribut diesen Aus dem gleichen Grund debuggen wir dies zuerstWas ist der Wert von $this
. $this
是什么值。
打印这个值都没什么必要,因为就是在本类中。
在类中属性的访问应该都会,就是直接使用$this->
即可。
所以说当系统访问$this->hook
Attribute in der Klasse Der Zugriff sollte einfach sein, verwenden Sie einfach $this-> reicht aus.
Führen Sie dann die make-Methode aus, um eine Instanz der Klasse zu erstellen.
🎜🎜🎜 Erstellen Sie eine Instanz einer Klasse 🎜🎜🎜🎜 Zusammenfassung 🎜🎜Also verwenden wir die magischen Methoden ArrayAccess und __get, 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 app['request'] auftritt, wird ArrayAccess ausgeführt und dann wird offsetGet ausgeführt.
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!