ホームページ  >  記事  >  PHPフレームワーク  >  ThinkPHP ファサードのソースコード分析

ThinkPHP ファサードのソースコード分析

咔咔
咔咔オリジナル
2020-11-05 12:02:372100ブラウズ
#”この記事では主にファサードの使用方法と実装プロセスについて説明し、ソース コードを分析します。

##”

##フレームワークを使用するパートナーは、5.1 でフレームワークに新しい機能が追加されたことを知っておく必要があります。記事で書きますが、それはファサードの特徴です。

この機能を使用したことのある人なら誰でも、メソッド呼び出しを定義するためにキーワード static を使用せずに、メソッド呼び出しを静的に直接呼び出すことができるという利点を理解しているでしょう。

次に、Kaka は次の側面からファサードのストーリーを探求します。

#1. フレームワークにおけるファサードの利点を簡単に理解する構成ファイルのロードについては、以前に書きました。この記事の最後には、構成情報を取得するいくつかの方法が記載されています。

メソッドの 1 つは Config::get() です。この記事では、Config を使用して構成情報を取得する場合、最初に

use think\facade\Config

を導入する必要があることを理解する必要があります。エイリアスはシステムに登録されているので、

use Config を使用するだけです。

ここでは use think\facade\Config を使用していますが、呼び出される実際のメソッドは thinkphp/library/think/Facade.php ##method の __callStatic# です。

次に、同じファイルの

createFacade メソッドが実行されます。

ソース コードはまだ見ていませんが、知っておくと便利です。

createFacade メソッドを呼び出すと、コンテナ クラスから直接取得されます。

コンテナを学習するとき、コンテナは登録ツリー モードを使用することを誰もが知っています。対応するオブジェクト インスタンスを使用する必要がある場合は、それを直接取得できるため、クラスを繰り返し作成する必要がなくなります。それが利点の 1 つです。コンテナの特性を利用する

以前の config の使用では、config の名前空間を使用し、それを呼び出す前にインスタンス化する必要があります。

現時点で config の使用が許可されていない場合は、作成した config クラスを使用する必要があります。ファサード モードを使用しない場合は、多くのコードを変更する必要があり、これはグローバルです。

しかし、フレームワークでファサード モードを使用する場合は、

getFacadeClass メソッドを書き直すだけでよく、返される結果を変更して自分で定義するだけで済みます。他のファイルがインスタンスを呼び出すときにインスタンスが何を呼び出すかは考慮されますが、メソッド名と返される結果のみが考慮されます。

2. 学習フレームワークでのファサードの使用

まずコントローラー ファサードを作成し、次の内容を記述します。

ここでは、単純にファサード メソッドを使用して構成ファイル情報を取得します。

ThinkPHP ファサードのソースコード分析ここでは、config クラスのエイリアスである use Config が使用されていることがわかります。

エイリアス設定は base.php で設定されます。

ThinkPHP ファサードのソースコード分析フレームワークでファサードを正しく使用する方法!

アプリ ディレクトリに新しいフォルダー ファサードを作成し、特にファサード クラスを保存します。

#ここで Sessions クラスが作成されます。

最初にテストを実行して、コードに問題がないかどうかを確認します。コントローラーのファサード ファイルでテストします。 ThinkPHP ファサードのソースコード分析

これは、ファサードが使用されていない場合の処理​​方法です。対応するクラスを導入し、それをインスタンス化し、インスタンス化されたクラスを使用してメソッド呼び出しを行う必要があります。

結果を印刷します。結果は期待どおりです。 ThinkPHP ファサードのソースコード分析

では、このコードをファサード モードに変更するにはどうすればよいでしょうか。カカの足跡を一歩ずつたどってください。 ThinkPHP ファサードのソースコード分析

最初に、kaka ディレクトリに 2 つのディレクトリ (facade と util) を作成します。

なぜこれら 2 つのフォルダを作成する必要があるのですか。 util はツール クラスであり、このクラス ファイルは他のプロジェクトで共有できることを誰もが知っているはずです。 ThinkPHP ファサードのソースコード分析

つまり、1 つのコピーを実装するだけで済み、それを他のプロジェクトで直接使用できます。

したがって、ファイルを util ディレクトリに直接コピーできますが、名前空間を変更することを忘れないでください。

ThinkPHP ファサードのソースコード分析次に、facade ディレクトリに新しい Sessions クラスを作成し、Facade を継承します。次に内容を書きます。

ThinkPHP ファサードのソースコード分析この時点で、コントローラーをテストすることにします。

結果は前と同じであることがわかりますが、明らかな違いは、ファサード モードを使用した後、静的メソッドを直接使用して呼び出すことができることです。

前に述べたファサードの利点の 1 つをまだ覚えていますか?

このセッション ツール クラスが将来使用されなくなると仮定すると、getFacadeClass メソッドの内容を変更するだけで済みます。

ThinkPHP ファサードのソースコード分析ThinkPHP ファサードのソースコード分析

3. フレームワーク内のファサードの使用を最適化する# #上記では、クラスのインスタンス化からファサードメソッドの使用まで同じ機能を実装しました。

目的の効果が表示されますが、コードはまだ十分に簡潔で美しくなく、構造が比較的わかりにくいです。

次に、カカが実現可能な計画を提示します。他の計画がある場合は、それを提案してください。コメントセクションでお会いしましょう。

通常の開発作業では、カスタマイズされたファサード クラスを 1 つまたは少数だけ使用することは不可能ですが、複雑なプロジェクトでは、多数のファサード クラスが存在します。

たくさんあるので管理が必要です。

まず、ファサードに属する構成クラスを作成します。

プロキシ クラスを実際のクラスにマッピングし、エイリアスを設定します。

ThinkPHP ファサードのソースコード分析このとき、フックファイルを作成し、その中にファサードクラスの登録とファサードカテゴリ名の登録を入れて実行する必要があります。

ThinkPHP ファサードのソースコード分析最後のステップでは、フック ファイルが作成されますが、実行はされません。

それでは、フック ファイルはいつ実行する必要があるのでしょうか?つまり、アプリケーションの初期化時にロードされます。

TP5.1 のアプリケーション初期化設定は、ファイル application/tags.php にあります。

アプリケーション初期化設定項目にフックファイルを設定するだけです。

ThinkPHP ファサードのソースコード分析テスト

最後のステップはテストです。引き続き、application/index/controller/Facade.php 内の # を実行します。ファイル##getUserInfoメソッド。

テスト結果によると、ソリューションのコードを記述するのに問題がないことがわかります。

ThinkPHP ファサードのソースコード分析ここで問題が見つかりましたか。つまり、ファサード クラスのエイリアスがフックで定義されているため、ここでは使用されていません。 ThinkPHP ファサードのソースコード分析

次に、エイリアスを使用してテストします。

ThinkPHP ファサードのソースコード分析ThinkPHP ファサードのソースコード分析

4. ファサード クラスのソース コード分析

ソースを解析する前にコード 2 つの方法を知ってください。

  • __callStatic: このメソッドは、存在しない静的メソッドがアクセスされたときに呼び出されます。
  • call_user_func_array: この関数を使用して関数を直接呼び出すことができます。

設定ファイルの取得から解析を開始します

ThinkPHP ファサードのソースコード分析実行Config::get('facade.');となります。ファイル thinkphp/library/think/facade/Config.php で実行されます。

このファイルでは、前述したように、getFacadeClass メソッドが存在する場合、対応するエイリアスを直接返します。

存在しない場合は、bind メソッドを使用してファサードをバインドする必要があります。

ここで理解できない場合は、ドキュメントにアクセスしてファサードの章をよく見る必要があります。

ThinkPHP ファサードのソースコード分析上記のクラスには get メソッドがないため、thinkphp/library/think/Facade.php ファイルの __callStatic メソッドが直接呼び出されます。

このメソッドは記事の冒頭で直接説明していますが、このメソッドは存在しない静的メソッドにアクセスするときに呼び出されます。

ThinkPHP ファサードのソースコード分析次に、このクラスの createFacade メソッドが実行されます。

このメソッドには、次のようなコード行があります。$facadeClass = static ::getFacadeClass();このコードについては、以下で詳しく説明します。

サブクラスにも同じメソッドがあり、このクラスにも同じメソッドがありますが、このクラスのメソッドには戻り値がありません。

この時点で、まったく混乱していませんか? ここで使用されている静的メソッドによってどのメソッドが実行されるでしょうか?または、なぜサブクラスメソッドが実行されるのかを考えてみましょう。

これらの質問については、以下で詳しく説明するので、最初にファサード クラスのソース コードを読んでみましょう。

この方法では、主に丸で囲ったいくつかの場所を調べます。

最初に、サブクラスの getFacadeClass メソッドからクラスのエイリアスを取得します。

2 番目のポイントは、サブクラスに getFacadeClass メソッドがない場合、手動でバインドされたプロパティから取得されることです。

3番目は前回の記事で紹介したコンテナですが、ここでは詳しく説明しませんので、分からない方はホームページをクリックして前回の記事を読んでください。

ThinkPHP ファサードのソースコード分析
createFacade メソッド

5.I の静的キーワード

ここで静的キーワードについて説明する必要があります。

新しい学習パートナーは、static が静的変数と静的メソッドを定義するために使用されることしか知らないかもしれません。

もちろん、ここでは静的メソッドと静的変数の定義方法については説明しませんが、非常に細かい点について説明します。

まず例を見てみましょう. この例も、ファサード ソース コードを読んだときに、ファサード ソース コードに基づいて Kaka によって調整されました。

Kaka はここで、test と test1 という 2 つの新しいファイルを作成しました。

test は test1 ファイルを継承し、同じメソッド getKaka を持ちます。

ThinkPHP ファサードのソースコード分析
2 つの新しいファイルを作成します

テスト ソース コード

ThinkPHP ファサードのソースコード分析
テスト ソース コード

test1 ソース コード

ThinkPHP ファサードのソースコード分析コントローラー呼び出し

ThinkPHP ファサードのソースコード分析結果の印刷ThinkPHP ファサードのソースコード分析この時点で少し混乱していますか? なぜ 456 ではなく 147 がここに印刷されているのでしょうか。

test1 のコードを変更し、static を self に変更します

ThinkPHP ファサードのソースコード分析結果を出力します

ThinkPHP ファサードのソースコード分析コードは誰でも読めると思います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 は、全員の混乱を避けるために簡単に紹介するためにこのメソッドを作成しました。

ThinkPHP ファサードのソースコード分析#thinkphp/library/think/Facade.php

#まず、ファサード クラスの具体的な実行プロセスをより明確に確認するために、ファサード フローチャートを見てみましょう。

ファサードクラスのソースコードは非常にシンプルなので、いくつかの特殊な知識を除けば十分に理解できると思います。

これは主に、ファサードのクラスを読んだ後に短い要約を作成するためのものです。 ThinkPHP ファサードのソースコード分析

ファサード クラスは、コンテナが対応するインスタンスを返す必要があるため、主にコンテナと組み合わせて実装される関数です。コンテナに関する記事も完成しています。コンテナに関する質問がある場合は、記事の先頭に移動して、該当する記事を読んでください。

この記事では、コンテナ内のファサードの使用方法を紹介し、その最適な使用方法を提供します。ここでの最良の方法は、カカの個人的な意見です。なぜなら、カカはこの方法で 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。