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

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

Nov 05, 2020 pm 12:02 PM
thinkphp

#”この記事では主にファサードの使用方法と実装プロセスについて説明し、ソース コードを分析します。

##”

##フレームワークを使用するパートナーは、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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

thinkphpプロジェクトの実行方法 thinkphpプロジェクトの実行方法 Apr 09, 2024 pm 05:33 PM

ThinkPHP プロジェクトを実行するには、Composer をインストールし、Composer を使用してプロジェクトを作成し、プロジェクト ディレクトリに入り、php bin/consoleserve を実行し、http://localhost:8000 にアクセスしてようこそページを表示する必要があります。

thinkphp にはいくつかのバージョンがあります thinkphp にはいくつかのバージョンがあります Apr 09, 2024 pm 06:09 PM

ThinkPHP には、さまざまな PHP バージョン向けに設計された複数のバージョンがあります。メジャー バージョンには 3.2、5.0、5.1、および 6.0 が含まれますが、マイナー バージョンはバグを修正し、新機能を提供するために使用されます。最新の安定バージョンは ThinkPHP 6.0.16 です。バージョンを選択するときは、PHP バージョン、機能要件、コミュニティ サポートを考慮してください。最高のパフォーマンスとサポートを得るには、最新の安定バージョンを使用することをお勧めします。

thinkphpの実行方法 thinkphpの実行方法 Apr 09, 2024 pm 05:39 PM

ThinkPHP フレームワークをローカルで実行する手順: ThinkPHP フレームワークをローカル ディレクトリにダウンロードして解凍します。 ThinkPHP ルート ディレクトリを指す仮想ホスト (オプション) を作成します。データベース接続パラメータを構成します。 Webサーバーを起動します。 ThinkPHP アプリケーションを初期化します。 ThinkPHP アプリケーションの URL にアクセスして実行します。

laravelとthinkphpではどちらが優れていますか? laravelとthinkphpではどちらが優れていますか? Apr 09, 2024 pm 03:18 PM

Laravel フレームワークと ThinkPHP フレームワークのパフォーマンスの比較: ThinkPHP は、最適化とキャッシュに重点を置いて、一般に Laravel よりもパフォーマンスが優れています。 Laravel は優れたパフォーマンスを発揮しますが、複雑なアプリケーションの場合は、ThinkPHP の方が適している可能性があります。

開発に関する提案: ThinkPHP フレームワークを使用して非同期タスクを実装する方法 開発に関する提案: ThinkPHP フレームワークを使用して非同期タスクを実装する方法 Nov 22, 2023 pm 12:01 PM

「開発に関する提案: ThinkPHP フレームワークを使用して非同期タスクを実装する方法」 インターネット技術の急速な発展に伴い、Web アプリケーションには、多数の同時リクエストと複雑なビジネス ロジックを処理するための要件が​​ますます高まっています。システムのパフォーマンスとユーザー エクスペリエンスを向上させるために、開発者は多くの場合、電子メールの送信、ファイルのアップロードの処理、レポートの生成など、時間のかかる操作を実行するために非同期タスクの使用を検討します。 PHP の分野では、人気のある開発フレームワークとして ThinkPHP フレームワークが、非同期タスクを実装するための便利な方法をいくつか提供しています。

thinkphpのインストール方法 thinkphpのインストール方法 Apr 09, 2024 pm 05:42 PM

ThinkPHP のインストール手順: PHP、Composer、および MySQL 環境を準備します。 Composer を使用してプロジェクトを作成します。 ThinkPHP フレームワークと依存関係をインストールします。データベース接続を構成します。アプリケーションコードを生成します。アプリケーションを起動し、http://localhost:8000 にアクセスします。

thinkphpのパフォーマンスはどうですか? thinkphpのパフォーマンスはどうですか? Apr 09, 2024 pm 05:24 PM

ThinkPHP は、キャッシュ メカニズム、コードの最適化、並列処理、データベースの最適化などの利点を備えた高性能 PHP フレームワークです。公式パフォーマンステストでは、1秒あたり10,000以上のリクエストを処理できることが示されており、実際のアプリケーションではJD.comやCtripなどの大規模なWebサイトやエンタープライズシステムで広く使用されています。

ファイル転送機能を実現するThinkPHP6とSwooleをベースとしたRPCサービス ファイル転送機能を実現するThinkPHP6とSwooleをベースとしたRPCサービス Oct 12, 2023 pm 12:06 PM

ThinkPHP6 と Swoole をベースとした RPC サービスがファイル転送機能を実装 はじめに: インターネットの発展に伴い、ファイル転送は私たちの日常業務においてますます重要になってきています。この記事では、ファイル転送の効率化とセキュリティを向上させるために、ThinkPHP6とSwooleをベースとしたファイル転送機能を実現するRPCサービスの具体的な実装方法を紹介します。 WebフレームワークとしてThinkPHP6を使用し、SwooleのRPC機能を利用してサーバー間のファイル転送を実現します。 1. 環境基準

See all articles