5. Spielen Sie mit Ihrer eigenen Containerklasse Funktion, Parameter mithilfe des Konstruktors zuweisen. In der Buy-Methode müssen keine Parameter übergeben werden, Sie müssen nur this->obj verwenden. Hier kommt die Reflexion ins Spiel, also lesen Sie sie unbedingt durch! Die Artikel sind alle miteinander verlinkt. Reflection Battle-Optimierungscode Der endgültige optimierte Code sieht so aus. Als nächstes werden wir diesen Code kurz analysieren. 文件 问题一:
Wenn Sie die -Route zu diesem Zeitpunkt immer noch direkt ausführen, wird der folgende Fehler gemeldet. Dies liegt daran, dass der Konstruktor in Person einen Parameter hat, den wir jedoch nicht übergeben haben.
Zu diesem Zeitpunkt müssen Sie eine Sache ändern: Wenn Sie Person instanziieren, übergeben Sie die Car-Instanz als Parameter, und es wird kein Problem geben.
Aber Sie werden herausfinden, was der Code oben ist. Die ursprünglich einfachen Codezeilen wurden zu diesem Zeitpunkt so kompliziert, dass sie mehr schaden als nützen Designmuster ist auch eine Belastung für das Projekt.
kaka/container/Container.php
这个类里边的get方法<span style="display: block; background: url(https://my-wechat.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #282c34; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;"></span><code class="hljs" style="overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;"><span class="hljs-meta" style="color: #61aeee; line-height: 26px;"><?php</span><br/><span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/> * Created by PhpStorm.<br/> * User: 咔咔<br/> * Date: 2020/9/21<br/> * Time: 19:04<br/> */</span><br/><br/><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">namespace</span> <span class="hljs-title" style="color: #61aeee; line-height: 26px;">container</span>;<br/><br/><br/><span class="hljs-class" style="line-height: 26px;"><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">class</span> <span class="hljs-title" style="color: #e6c07b; line-height: 26px;">Container</span><br/></span>{<br/> <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/> * 存放容器<br/> * <span class="hljs-doctag" style="color: #c678dd; line-height: 26px;">@var</span> array<br/> */</span><br/> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">public</span> $instances = [];<br/><br/> <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/> * 容器的对象实例<br/> * <span class="hljs-doctag" style="color: #c678dd; line-height: 26px;">@var</span> array<br/> */</span><br/> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">protected</span> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">static</span> $instance;<br/><br/> <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/> * 定义一个私有的构造函数防止外部类实例化<br/> * Container constructor.<br/> */</span><br/> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">private</span> <span class="hljs-function" style="line-height: 26px;"><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">function</span> <span class="hljs-title" style="color: #61aeee; line-height: 26px;">__construct</span><span class="hljs-params" style="line-height: 26px;">()</span> </span>{<br/><br/> }<br/><br/> <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/> * 获取当前容器的实例(单例模式)<br/> * <span class="hljs-doctag" style="color: #c678dd; line-height: 26px;">@return</span> array|Container<br/> */</span><br/> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">public</span> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">static</span> <span class="hljs-function" style="line-height: 26px;"><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">function</span> <span class="hljs-title" style="color: #61aeee; line-height: 26px;">getInstance</span> <span class="hljs-params" style="line-height: 26px;">()</span><br/> </span>{<br/> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">if</span>(is_null(<span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">self</span>::$instance)){<br/> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">self</span>::$instance = <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">new</span> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">self</span>();<br/> }<br/><br/> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">return</span> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">self</span>::$instance;<br/> }<br/><br/> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">public</span> <span class="hljs-function" style="line-height: 26px;"><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">function</span> <span class="hljs-title" style="color: #61aeee; line-height: 26px;">set</span> <span class="hljs-params" style="line-height: 26px;">($key,$value)</span><br/> </span>{<br/> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">return</span> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">$this</span>->instances[$key] = $value;<br/> }<br/><br/> <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/> * User : 咔咔<br/> * Notes: 获取容器里边的实例 使用反射<br/> * Time :2020/9/21 22:04<br/> * <span class="hljs-doctag" style="color: #c678dd; line-height: 26px;">@param</span> $key<br/> * <span class="hljs-doctag" style="color: #c678dd; line-height: 26px;">@return</span> mixed<br/> */</span><br/> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">public</span> <span class="hljs-function" style="line-height: 26px;"><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">function</span> <span class="hljs-title" style="color: #61aeee; line-height: 26px;">get</span> <span class="hljs-params" style="line-height: 26px;">($key)</span><br/> </span>{<br/> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">if</span>(!<span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">empty</span>(<span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">$this</span>->instances[$key])){<br/> $key = <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">$this</span>->instances[$key];<br/> }<br/><br/> $reflect = <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">new</span> \ReflectionClass($key);<br/> <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">// 获取类的构造函数</span><br/> $c = $reflect->getConstructor();<br/> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">if</span>(!$c){<br/> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">return</span> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">new</span> $key;<br/> }<br/><br/> <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">// 获取构造函数的参数</span><br/> $params = $c->getParameters();<br/> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">foreach</span> ($params <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">as</span> $param) {<br/> <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/> ReflectionClass Object<br/> (<br/> [name] => container\dependency\Car<br/> )<br/> */</span><br/> $class = $param->getClass();<br/> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">if</span>(!$class){<br/><br/> }<span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">else</span>{<br/> <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">// container\dependency\Car</span><br/> $args[] = <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">$this</span>->get($class->name);<br/> }<br/> }<br/> <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">// 从给出的参数创建一个新的类实例</span><br/> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">return</span> $reflect->newInstanceArgs($args);<br/> }<br/>}<br/></code>
application/index/controller/Container.php
这里就是修改之后的变动kaka/container/dependency/Person.php
Bestimmen Sie, ob sich die benannte Person im Container befindet
Verwenden Sie die Reflexion Schnittstelle und dann den Konstruktor der übergebenen Personenklasse abrufen
🎜Wenn Person keinen Konstruktor hat, geben Sie einfach die Instanz von Person direkt zurück🎜🎜Wenn Person existiert im Konstruktor, hol es dir Methoden des Personenkonstruktors🎜🎜Weil die Parameter des Konstruktors in der Personenklasse nicht auf einen beschränkt sind🎜🎜, also eine Schleife wird benötigt, um das Objekt jedes Parameters zu erhalten🎜🎜Verwenden Sie abschließend die reflektierte newInstanceArgs-Schnittstelle, um die entsprechende Instanz zu erstellenrrreee🎜fileapplication/index/controller/Container.php
Hier sind die Änderungen nach der Änderung🎜🎜🎜Frage 1: kaka/container/dependency/Person.php
Was bedeutet der Parameter Car inside? Diese Frage ist eigentlich sehr einfach . Sie können sehen, dass es sich bei diesem Auto um die Car.php-Datei desselben Verzeichnisses handelt. Sie können es direkt als Dateien unter demselben Namensraum verstehen. 🎜Frage 2: Datei application/index/controller/Container.php
Warum kann die Buy-Methode direkt aufgerufen werden?
Sehen Sie sich zunächst den Wert von obj an, sodass Sie ihn nicht instanziieren müssen kann die Methode „Direkt kaufen“ aufrufen, da die Parameter direkt übergeben werden.
Das Obige ist ein einfacher Container, der von Kaka implementiert wurde. Wenn Sie ihn nicht verstehen oder Fragen haben, können Sie direkt antworten im Kommentarbereich.
Der nächste Schritt besteht darin, die Container im Framework zu analysieren und sie Schritt für Schritt bis zur Ursache zurückzuverfolgen.
„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 vonThinkPHP spielt mit einer eigenen Containerklasse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!