ホームページ >PHPフレームワーク >ThinkPHP >ThinkPHP ファサードのソースコード分析
#”この記事では主にファサードの使用方法と実装プロセスについて説明し、ソース コードを分析します。##”
use think\facade\Config
を導入する必要があることを理解する必要があります。エイリアスはシステムに登録されているので、use Config を使用するだけです。
ここでは use think\facade\Config
を使用していますが、呼び出される実際のメソッドは thinkphp/library/think/Facade.php
##method の __callStatic# です。
createFacade メソッドが実行されます。
createFacade メソッドを呼び出すと、コンテナ クラスから直接取得されます。
getFacadeClass メソッドを書き直すだけでよく、返される結果を変更して自分で定義するだけで済みます。他のファイルがインスタンスを呼び出すときにインスタンスが何を呼び出すかは考慮されますが、メソッド名と返される結果のみが考慮されます。
ここでは、config クラスのエイリアスである use Config
が使用されていることがわかります。
エイリアス設定は base.php
で設定されます。
フレームワークでファサードを正しく使用する方法!
アプリ ディレクトリに新しいフォルダー ファサードを作成し、特にファサード クラスを保存します。
#ここで Sessions クラスが作成されます。最初にテストを実行して、コードに問題がないかどうかを確認します。コントローラーのファサード ファイルでテストします。
これは、ファサードが使用されていない場合の処理方法です。対応するクラスを導入し、それをインスタンス化し、インスタンス化されたクラスを使用してメソッド呼び出しを行う必要があります。結果を印刷します。結果は期待どおりです。
では、このコードをファサード モードに変更するにはどうすればよいでしょうか。カカの足跡を一歩ずつたどってください。
最初に、kaka ディレクトリに 2 つのディレクトリ (facade と util) を作成します。なぜこれら 2 つのフォルダを作成する必要があるのですか。 util はツール クラスであり、このクラス ファイルは他のプロジェクトで共有できることを誰もが知っているはずです。
つまり、1 つのコピーを実装するだけで済み、それを他のプロジェクトで直接使用できます。 したがって、ファイルを util ディレクトリに直接コピーできますが、名前空間を変更することを忘れないでください。次に、facade ディレクトリに新しい Sessions クラスを作成し、Facade を継承します。次に内容を書きます。
この時点で、コントローラーをテストすることにします。
結果は前と同じであることがわかりますが、明らかな違いは、ファサード モードを使用した後、静的メソッドを直接使用して呼び出すことができることです。
前に述べたファサードの利点の 1 つをまだ覚えていますか?
このセッション ツール クラスが将来使用されなくなると仮定すると、getFacadeClass
メソッドの内容を変更するだけで済みます。
目的の効果が表示されますが、コードはまだ十分に簡潔で美しくなく、構造が比較的わかりにくいです。
次に、カカが実現可能な計画を提示します。他の計画がある場合は、それを提案してください。コメントセクションでお会いしましょう。
通常の開発作業では、カスタマイズされたファサード クラスを 1 つまたは少数だけ使用することは不可能ですが、複雑なプロジェクトでは、多数のファサード クラスが存在します。
たくさんあるので管理が必要です。
まず、ファサードに属する構成クラスを作成します。プロキシ クラスを実際のクラスにマッピングし、エイリアスを設定します。
このとき、フックファイルを作成し、その中にファサードクラスの登録とファサードカテゴリ名の登録を入れて実行する必要があります。
最後のステップでは、フック ファイルが作成されますが、実行はされません。
それでは、フック ファイルはいつ実行する必要があるのでしょうか?つまり、アプリケーションの初期化時にロードされます。
TP5.1 のアプリケーション初期化設定は、ファイル application/tags.php
にあります。
アプリケーション初期化設定項目にフックファイルを設定するだけです。
テスト
最後のステップはテストです。引き続き、application/index/controller/Facade.php
内の # を実行します。ファイル##getUserInfoメソッド。
ここで問題が見つかりましたか。つまり、ファサード クラスのエイリアスがフックで定義されているため、ここでは使用されていません。
次に、エイリアスを使用してテストします。ソースを解析する前にコード 2 つの方法を知ってください。
__callStatic
: このメソッドは、存在しない静的メソッドがアクセスされたときに呼び出されます。 call_user_func_array
: この関数を使用して関数を直接呼び出すことができます。 設定ファイルの取得から解析を開始します
実行Config::get('facade.');
となります。ファイル thinkphp/library/think/facade/Config.php
で実行されます。
このファイルでは、前述したように、getFacadeClass
メソッドが存在する場合、対応するエイリアスを直接返します。
存在しない場合は、bind メソッドを使用してファサードをバインドする必要があります。
ここで理解できない場合は、ドキュメントにアクセスしてファサードの章をよく見る必要があります。
上記のクラスには get メソッドがないため、thinkphp/library/think/Facade.php
ファイルの __callStatic
メソッドが直接呼び出されます。
このメソッドは記事の冒頭で直接説明していますが、このメソッドは存在しない静的メソッドにアクセスするときに呼び出されます。
次に、このクラスの createFacade
メソッドが実行されます。
このメソッドには、次のようなコード行があります。$facadeClass = static ::getFacadeClass();
このコードについては、以下で詳しく説明します。
サブクラスにも同じメソッドがあり、このクラスにも同じメソッドがありますが、このクラスのメソッドには戻り値がありません。
この時点で、まったく混乱していませんか? ここで使用されている静的メソッドによってどのメソッドが実行されるでしょうか?または、なぜサブクラスメソッドが実行されるのかを考えてみましょう。
これらの質問については、以下で詳しく説明するので、最初にファサード クラスのソース コードを読んでみましょう。
この方法では、主に丸で囲ったいくつかの場所を調べます。
最初に、サブクラスの getFacadeClass
メソッドからクラスのエイリアスを取得します。
2 番目のポイントは、サブクラスに getFacadeClass
メソッドがない場合、手動でバインドされたプロパティから取得されることです。
3番目は前回の記事で紹介したコンテナですが、ここでは詳しく説明しませんので、分からない方はホームページをクリックして前回の記事を読んでください。
ここで静的キーワードについて説明する必要があります。
新しい学習パートナーは、static が静的変数と静的メソッドを定義するために使用されることしか知らないかもしれません。
もちろん、ここでは静的メソッドと静的変数の定義方法については説明しませんが、非常に細かい点について説明します。
まず例を見てみましょう. この例も、ファサード ソース コードを読んだときに、ファサード ソース コードに基づいて Kaka によって調整されました。
Kaka はここで、test と test1 という 2 つの新しいファイルを作成しました。
test は test1 ファイルを継承し、同じメソッド getKaka を持ちます。
テスト ソース コード
test1 ソース コード
コントローラー呼び出し
結果の印刷この時点で少し混乱していますか? なぜ 456
ではなく 147
がここに印刷されているのでしょうか。
test1 のコードを変更し、static を self に変更します
結果を出力します
コードは誰でも読めると思いますself を使用することは理解していますが、static を使用すると明確ではない結果が得られるのはなぜでしょうか。
この時点で、ドキュメントは有効になり始めますが、PHP ドキュメントを開くと、静的な記事にはこの状況についての説明がないことがわかります。
Kaka による多くのテストと情報レビューの後、最終的な要約結果は次のとおりです。
static::$test 継承されている場合は、デフォルトでサブクラスを呼び出します。それ以外の場合は、それ自体を呼び出します。
self::$test 継承されている場合は、このクラスを呼び出します。デフォルトでは
この例で説明すると、test が test1 を継承します。
静的を使用して test1 のメソッド getKaka
を呼び出す場合、デフォルトの呼び出しはテスト クラスの getKaka
(サブクラスのメソッド) です。
self を使用して test1 のメソッド getKaka
を呼び出す場合、デフォルトの呼び出しは test1 クラスの getKaka
(このクラスのメソッド) です。
この細かい点も、Kaka が偶然発見したものです。何か問題がある場合は、指摘していただければ、Kaka が変更を加えます。
継承には別の状況があるため、Kaka が非公開でテストするため、ここでは説明しません。
ここでのこの静的な説明は、主に thinkphp/library/think/Facade.php
ファイル内のこのコード行を説明することです。
このコード行によって呼び出されるメソッドはサブクラスと親クラスの両方に存在するため、Kaka は、全員の混乱を避けるために簡単に紹介するためにこのメソッドを作成しました。
ファサードクラスのソースコードは非常にシンプルなので、いくつかの特殊な知識を除けば十分に理解できると思います。
これは主に、ファサードのクラスを読んだ後に短い要約を作成するためのものです。
ファサード クラスは、コンテナが対応するインスタンスを返す必要があるため、主にコンテナと組み合わせて実装される関数です。コンテナに関する記事も完成しています。コンテナに関する質問がある場合は、記事の先頭に移動して、該当する記事を読んでください。 この記事では、コンテナ内のファサードの使用方法を紹介し、その最適な使用方法を提供します。ここでの最良の方法は、カカの個人的な意見です。なぜなら、カカはこの方法で 2 年近く使用しているからです。これは、コードの堅牢性とスケーラビリティの点で非常に実用的です。
それでは、static キーワードについて、皆さんにあまり知られていない知識を追加しておきますが、クラスがクラスを継承する際、親クラスが static キーワードを使用すると、デフォルトでサブクラスのメソッドが呼び出されます。
ここでの概要は、この記事の例のみを対象としています。
実は、Kaka がここで 1 つの点について説明したいと思います。それは、return call_user_func_array([static::createFacade(), $method], $params);
前の使用法ではパラメータは直接メソッドでしたが、ここでは配列形式に遭遇します。この配列内の 2 つの値は何を表すのでしょうか?
最初の値はインスタンスで、2 番目の値はインスタンス内のメソッドです。
Aboutcall_user_func_array
このメソッドの使用は KaKa によって行われません。KaKa が受信メソッドを実行することだけを知っておく必要があります。
ファサードのソース コード分析はここで終了します。ファサードはコンテナに基づいて実装されるため、最も重要なことはコンテナを理解することです。これが、Kaka が最初にコンテナを作成してから、ファサード。
さらに、カカはファサードの使用計画も提供しました。より良い計画がある場合は、コメント エリアに一般的なアイデアを提供できます。
「学習の継続、ブログの継続、共有の継続は、カカがそのキャリア以来常に支持してきた信念です。巨大なインターネット上のカカの記事がそうであることを願っています」 Silk のお手伝いをします。私の名前はカカです。また次回お会いしましょう。
”
以上がThinkPHP ファサードのソースコード分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。