ThinkPHP spielt mit einer eigenen Containerklasse

咔咔
Freigeben: 2020-10-12 13:57:59
Original
1895 Leute haben es durchsucht

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.

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.

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.

  • Auf der Grundlage des vorherigen Codes ist nur der kaka/container/Container.php这个类里边的get方法
  • 判断这个名person是否在容器中
  • 使用反射接口,然后获取传进去person类的构造方法
  • 如果person没有构造方法就直接返回person这个实例即可
  • 如存person在构造函数,则获取person构造函数的方法
  • 由于person类里边的构造函数的参数不会仅限于一个
  • 所以需要循环来获取每个参数的对象
  • 最后使用反射的 newInstanceArgs接口创建对应的实例
<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>
Nach dem Login kopieren

ThinkPHP spielt mit einer eigenen Containerklasse文件application/index/controller/Container.php这里就是修改之后的变动

ThinkPHP spielt mit einer eigenen Containerklasse问题一:kaka/container/dependency/Person.phpBestimmen 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🎜hier Bildbeschreibung einfügenfileapplication/index/controller/Container.phpHier sind die Änderungen nach der Änderung🎜🎜Bildbeschreibung hier einfügen🎜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. 🎜

ThinkPHP spielt mit einer eigenen ContainerklasseFrage 2: Datei application/index/controller/Container.phpWarum 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.

ThinkPHP spielt mit einer eigenen Containerklasse
Hier Bildbeschreibung einfügen

ThinkPHP spielt mit einer eigenen ContainerklasseDas 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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!