ThinkPHP は独自のコンテナー クラスを操作します

咔咔
リリース: 2020-10-12 13:57:59
オリジナル
1935 人が閲覧しました
#"この記事では、単純なコンテナ クラスを実装します

"

5 , 独自のコンテナ クラスで遊んでみましょう

今回は、パーソン ファイルを変更します

コンストラクターを追加し、コンストラクターを使用してパラメーターを割り当てます。メソッドの場合、パラメータを渡す必要はなく、this->obj を使用するだけです。

この時点で ThinkPHP は独自のコンテナー クラスを操作しますdependency ルートを直接実行すると、次のエラーが報告されます。これは、Personal のコンストラクターにパラメーターがあるにもかかわらず、渡されていないためです。それ。

この時点で、1 つ変更する必要があるのは、Personal をインスタンス化するときに Car インスタンスをパラメータとして渡すことです。問題ありません。 ThinkPHP は独自のコンテナー クラスを操作します

ThinkPHP は独自のコンテナー クラスを操作しますここに画像の説明を挿入
ただし、上記のコードが何であるかはわかります。元々は単純な数行のコードが、このように複雑になってしまいました。時間はすでに利益よりも害を及ぼしており、デザインパターンがどれほど優れていても、盲目的に使用することはプロジェクトにとって負担となります。

So this is whenReflection Comes. リフレクションについては上で簡単に紹介していますので、ぜひ読んでみてください。記事はすべてリンクされています。

Reflection Battle 最適化コード

最終的に最適化されたコードは次のようになります。次に、このコードを簡単に分析します。

  • # 前のコードに基づいて、
    kaka/container/Container.php の get メソッドのみが変更されました
  • #指定された人物がコンテナ内に存在するかどうかを確認します。
  • リフレクション インターフェイスを使用して、渡された person クラスのコンストラクターを取得します。
  • Ifコンストラクタ メソッドは、person のインスタンスを直接返すことができます。
  • person がコンストラクタに格納されている場合は、person コンストラクタのメソッドを取得します。
  • # # Because person クラス内のコンストラクターのパラメータは
  • 1 つに限定されないため、各パラメータのオブジェクトを取得するにはループする必要があります
  • 最後にリフレクションを使用します。 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>
    ログイン後にコピー
  • File
application/index/controller/Container.php

以降の変更点は次のとおりです。変更ThinkPHP は独自のコンテナー クラスを操作します

質問 1:

kaka/container/dependency/person.phpThinkPHP は独自のコンテナー クラスを操作しますパラメータ Car inside は何を意味しますか?これ質問は実際には非常に簡単です。この車は同じディレクトリにある Car.php ファイルであることがわかります。同じ名前空間内のファイルとして直接理解できます。

ThinkPHP は独自のコンテナー クラスを操作します質問 2: Fileapplication/index/controller/Container.php buy メソッドを直接呼び出せるのはなぜですか

まず値を見てください。 obj の場合、Car クラスは返されたオブジェクト内ですでにインスタンス化されているため、インスタンス化する必要はありません。パラメーターが直接渡されるため、buy メソッドを直接呼び出すことができます。 #ここに画像を挿入 説明

ThinkPHP は独自のコンテナー クラスを操作します
上記は Kaka によって実装された単純なコンテナです。わからない場合や質問がある場合は、コメント エリアで直接返信できます。
次のステップは、フレームワーク内のコンテナを分析し、根本原因を段階的に追跡することです。

ThinkPHP は独自のコンテナー クラスを操作します

学習の継続、ブログの継続、共有の継続は、カカがそのキャリア以来常に支持してきた信念です。巨大なインターネット上のカカの記事がそうであることを願っています」 Silk のお手伝いをします。私の名前はカカです。また次回お会いしましょう。

以上がThinkPHP は独自のコンテナー クラスを操作しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート