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 メソッドを呼び出すと、コンテナ クラスから直接取得されます。
getFacadeClass メソッドを書き直すだけでよく、返される結果を変更して自分で定義するだけで済みます。他のファイルがインスタンスを呼び出すときにインスタンスが何を呼び出すかは考慮されますが、メソッド名と返される結果のみが考慮されます。
2. 学習フレームワークでのファサードの使用
まずコントローラー ファサードを作成し、次の内容を記述します。 ここでは、単純にファサード メソッドを使用して構成ファイル情報を取得します。ここでは、config クラスのエイリアスである
use Config
が使用されていることがわかります。
エイリアス設定は base.php
で設定されます。
フレームワークでファサードを正しく使用する方法!
アプリ ディレクトリに新しいフォルダー ファサードを作成し、特にファサード クラスを保存します。
#ここで Sessions クラスが作成されます。最初にテストを実行して、コードに問題がないかどうかを確認します。コントローラーのファサード ファイルでテストします。
結果を印刷します。結果は期待どおりです。
では、このコードをファサード モードに変更するにはどうすればよいでしょうか。カカの足跡を一歩ずつたどってください。
なぜこれら 2 つのフォルダを作成する必要があるのですか。 util はツール クラスであり、このクラス ファイルは他のプロジェクトで共有できることを誰もが知っているはずです。
次に、facade ディレクトリに新しい Sessions クラスを作成し、Facade を継承します。次に内容を書きます。
この時点で、コントローラーをテストすることにします。
結果は前と同じであることがわかりますが、明らかな違いは、ファサード モードを使用した後、静的メソッドを直接使用して呼び出すことができることです。
前に述べたファサードの利点の 1 つをまだ覚えていますか?
このセッション ツール クラスが将来使用されなくなると仮定すると、getFacadeClass
メソッドの内容を変更するだけで済みます。
3. フレームワーク内のファサードの使用を最適化する# #上記では、クラスのインスタンス化からファサードメソッドの使用まで同じ機能を実装しました。
目的の効果が表示されますが、コードはまだ十分に簡潔で美しくなく、構造が比較的わかりにくいです。
次に、カカが実現可能な計画を提示します。他の計画がある場合は、それを提案してください。コメントセクションでお会いしましょう。
通常の開発作業では、カスタマイズされたファサード クラスを 1 つまたは少数だけ使用することは不可能ですが、複雑なプロジェクトでは、多数のファサード クラスが存在します。
たくさんあるので管理が必要です。
まず、ファサードに属する構成クラスを作成します。プロキシ クラスを実際のクラスにマッピングし、エイリアスを設定します。
このとき、フックファイルを作成し、その中にファサードクラスの登録とファサードカテゴリ名の登録を入れて実行する必要があります。
最後のステップでは、フック ファイルが作成されますが、実行はされません。
それでは、フック ファイルはいつ実行する必要があるのでしょうか?つまり、アプリケーションの初期化時にロードされます。
TP5.1 のアプリケーション初期化設定は、ファイル application/tags.php
にあります。
アプリケーション初期化設定項目にフックファイルを設定するだけです。
テスト
最後のステップはテストです。引き続き、application/index/controller/Facade.php
内の # を実行します。ファイル##getUserInfoメソッド。
ここで問題が見つかりましたか。つまり、ファサード クラスのエイリアスがフックで定義されているため、ここでは使用されていません。
4. ファサード クラスのソース コード分析
ソースを解析する前にコード 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番目は前回の記事で紹介したコンテナですが、ここでは詳しく説明しませんので、分からない方はホームページをクリックして前回の記事を読んでください。
5.I の静的キーワード
ここで静的キーワードについて説明する必要があります。
新しい学習パートナーは、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 は、全員の混乱を避けるために簡単に紹介するためにこのメソッドを作成しました。
#まず、ファサード クラスの具体的な実行プロセスをより明確に確認するために、ファサード フローチャートを見てみましょう。
ファサードクラスのソースコードは非常にシンプルなので、いくつかの特殊な知識を除けば十分に理解できると思います。
これは主に、ファサードのクラスを読んだ後に短い要約を作成するためのものです。
これは、コードの堅牢性とスケーラビリティの点で非常に実用的です。
それでは、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 サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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

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

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