ホームページ  >  記事  >  PHPフレームワーク  >  ThinkPHP の Loader の自動ロードを理解する方法

ThinkPHP の Loader の自動ロードを理解する方法

WBOY
WBOY転載
2021-12-20 14:06:381956ブラウズ

この記事では、thinkphp でのローダーの自動読み込みに関する関連知識を提供します。主に Composer の読み込みに関する関連知識が含まれています。皆様のお役に立てれば幸いです。

ThinkPHP の Loader の自動ロードを理解する方法1. 自動ロードローダーのソースコード分析

#1-1 学習目標

    ##クラスの自動ロード
  • ##クラスの自動ロードの 2 つの方法
  • spl_autoload_register は、カスタム ファイル クラスの自動読み込みを実装するために
  • を使用する必要があります
  • 1-2 Composer の読み込み

#ここに画像の説明を挿入します。ThinkPHP の Loader の自動ロードを理解する方法まず、base.php にローダー クラスをロードし、次に Register this メソッドを呼び出します。 。

thinkphp\library\think\Loader.php にアクセスすると、register メソッドがあります。このメソッドでは、まず最初の知識ポイント spl_autoload_register() を学習し、次のことについて話します。 spl_autoload_過去と現在の生活を登録し、クリックするだけで簡単に使用できます。

ThinkPHP の Loader の自動ロードを理解する方法次のステップは、プロジェクトのルート パスとコンポーザーのパスです。

#ここに画像の説明を挿入

ここからはコンポーザー ファイルの読み込みです。プロセスも非常に簡単ですThinkPHP の Loader の自動ロードを理解する方法

composer がディレクトリかどうかを判断する

  • パス配下の autoload_static.php がファイルであるかを判断する

  • ##autoload_static.php ファイルを導入する
  • 宣言されたすべてのクラスを返す配列 return
  • 最後のクラスを取得する ComposerStaticInit30742487e00917c888d89ba216f165b9
  • Judge ComposerStaticInit30742487e00917c888d89ba216f165b9 にデータが存在します配列
  • その後、vendor\composer\autoload_static.php ファイルに移動して、これら 2 つの属性を確認できます

ThinkPHP の Loader の自動ロードを理解する方法

ここにコードがあります。一部の学生は self::${$attr} = $composerClass::${$attr}; を使用すると推定されます。ここでの $attr は ' prefixLengthsPsr4' 、 'prefixDirsPsr4'、 'fallbackDirsPsr4'、 'prefixesPsr0'、 'fallbackDirsPsr0'、 'classMap'、 'files'、これらのデータは、外側の層に $ 記号を追加します。

したがって、対応する属性値は ComposerStaticInit30742487e00917c888d89ba216f165b9 クラスで直接取得されます。これは、上図の 2 つの属性値です。

ThinkPHP の Loader の自動ロードを理解する方法

#1-3 名前空間の登録

ファイルは依然として thinkphp\library\think\Loader.php# の register メソッドですThinkPHP の Loader の自動ロードを理解する方法##ここでは、think と traits という 2 つのコマンド スペースが登録されています。次に、addNamespace メソッドを入力します。

addNamespace メソッドでは、Psr4 スペースが追加されます。

次に、addPsr4 メソッドに進みます。両方の名前空間は、

ComposerStaticInit1e269472f484e157e90227b420ffca7a クラスの $prefixLengthsPsr4 プロパティと $prefixDirsPsr4 プロパティに登録されています。ThinkPHP の Loader の自動ロードを理解する方法

ThinkPHP の Loader の自動ロードを理解する方法

上記を確認するには、デバッグ ブレークポイントを作成します。これらのデータを見れば一目瞭然ですが、特性についても登録方法は同じです。

これで名前空間が登録されましたので、次に psr4 名前空間とは何かを勉強してみましょう。

ThinkPHP の Loader の自動ロードを理解する方法

1-4 Psr4

psr とは、単にファイル パスと、対応するファイルを自動的にロードするための関連仕様として理解されます。 class 、現在 TP5.1 は psr4 仕様を使用しています。

ThinkPHP の Loader の自動ロードを理解する方法ここでのクラスは、クラス、インターフェイス、およびスーパー クラスの構造を指します

完全なクラスには次の構造が必要です\( \ )*\次の仕様は PHP ドキュメントから引用されています

完全なクラス名には、というトップレベルの名前空間が必要です。 "vendor namespace";

完全なクラス名には 1 つ以上のサブ名前空間を含めることができます;

  • 完全なクラス名には最終クラスが必要です名前;###

  • 完全なクラス名のどの部分のアンダースコアにも特別な意味はありません。

  • 完全なクラス名は、任意の大文字と小文字で構成できます。

  • すべてのクラス名では大文字と小文字を区別する必要があります。

以下は公式の例です。この psr 仕様が理解できる方は理解してみてください

ThinkPHP の Loader の自動ロードを理解する方法

1 - 5 クラス ライブラリ マッピング ファイルをロードします。

この時点で、なぜここに classmap.php ファイルがないのかという疑問が必ず出てきます。

ThinkPHP の Loader の自動ロードを理解する方法

#急がず、パニックにならず、まず php think optimize:autoload を実行してファイルを取得します。

ThinkPHP の Loader の自動ロードを理解する方法

##最終的にはそこに到達します。このメソッドの addClassMap メソッドは、classmap.php ファイルのデータを $classMap に代入するだけであり、他の用途はありません。

ThinkPHP の Loader の自動ロードを理解する方法

##1-6 extend ディレクトリを自動的にロードする

extend このディレクトリは、TP フレームワークを使用しているすべての人が使用し、カスタマイズされたクラス ライブラリ ファイルをこのディレクトリに保存できます。

下の図からわかるように、addAutoLoadDir メソッドを使用してロードします。

ThinkPHP の Loader の自動ロードを理解する方法メソッドでは、拡張パスを $ に割り当てるだけです。 fallbackDirsPsr4.このプロパティ。

ThinkPHP の Loader の自動ロードを理解する方法Loader::register(); の部分はこれで終わりです。次に、内部実装と実際のケースを詳しく見ていきます。

上記の読み込みソースコードには 4 つの属性があります。それらを簡単にまとめます。

ThinkPHP の Loader の自動ロードを理解する方法

2. の読み込みプロセスを簡単に説明します。クラス

ThinkPHP の Loader の自動ロードを理解する方法ここに画像の説明を挿入

ソースの解析を開始しましたコードはここにあります spl_autoload_register

という関数があります 使用するクラスが導入されていない場合、PHPがエラーを報告する前にこの関数がトリガーされます 未定義のクラス名がパラメータとして渡され、 \\Loader::このメソッドを自動ロードします

ブレークポイントの後の最初にアンロードされたクラスは think\ErrorThinkPHP の Loader の自動ロードを理解する方法

です##なぜ think\Error なのか! thinkphp/base.php に戻って確認してください。自動読み込みが完了すると、最初に実行されるクラスは ErrorThinkPHP の Loader の自動ロードを理解する方法

です。このエラーを Kaka に変更して印刷し、クラスを Kaka に変更します。この時点で、誰もがこのクラスの自動読み込みメカニズムをある程度理解しています。 ThinkPHP の Loader の自動ロードを理解する方法

使用するクラスが導入されていない場合、このクラスは thinkphp/library/think/Loader.php の autoload メソッドにパラメータとして渡されます。

ここで autoload メソッドを見てみましょう ThinkPHP の Loader の自動ロードを理解する方法

findFile メソッドから始めて、未使用のクラスがこのメソッドに渡されます。findFile メソッドでは、think\Error クラスによってマップされたファイルが classMap 属性から直接返されます。ThinkPHP の Loader の自動ロードを理解する方法

Return think\ autoloadのfile変数にErrorクラスのフルパスを返すと、win環境のサイズが一度判定されます。 ThinkPHP の Loader の自動ロードを理解する方法

その後、ファイルが返されるまで include を使用してファイルを導入します。

ここまでは、クラスの完全な自動ロードと分析です。

これで終わりですが、$classMap 属性についても触れておく必要があります。この属性は、classmap.php ファイルに基づいています。このファイルの生成も必要です。コマンド php think optimize:autoload を実行することによって生成されます。 ThinkPHP の Loader の自動ロードを理解する方法

このファイルが生成されない場合、プログラムはどのように実行されるのでしょうか。

これまでの処理はすべて同じで、findFile だけが異なりますので、簡単に整理してみましょう。

現時点ではコードは classMap を通過しません。

ThinkPHP の Loader の自動ロードを理解する方法

最初に think\Error ファイルを取得します

ThinkPHP の Loader の自動ロードを理解する方法

次に、Composer の自動読み込みの 2 つの属性を通じて名前空間を取得し、think\Error.php ファイルを結合します。

ThinkPHP の Loader の自動ロードを理解する方法

返される最終結果も D:\ です。 phpstudy_pro\ WWW\ThinkPHPSourceCodeAnalysis\thinkphp\library\think\Error.php ファイル。

ここのコードは注意深く読む必要があります。

クラスの自動ロードはここで完全に終了です。

3. カスタム ファイルを使用したクラスの自動読み込みを実装する方法

最初にフォルダー kaka を作成します

ThinkPHP の Loader の自動ロードを理解する方法

この時点で、直接アクセスするために、ファイル Kaka.php をコントローラーのインデックスに導入します

ThinkPHP の Loader の自動ロードを理解する方法

この時点で、このクラスは必ずエラーを報告しますでは、どうすればよいでしょうか? クリックするだけで直接アクセスできます。

ThinkPHP の Loader の自動ロードを理解する方法

ここに画像の説明を挿入

この時点で、ソース コードの重要性が明らかになります。自動的にロードされる register 関数では、extend がロードされることに注意してください。ディレクトリ

ThinkPHP の Loader の自動ロードを理解する方法

##ここに画像の説明を挿入

##この時点で、kaka ディレクトリを追加し、直接アクセスします

何も問題ありません。直接出てきました。すべてOKです。エクステントのロード方法について話しましょう。 ThinkPHP の Loader の自動ロードを理解する方法

自動ロードクラスライブラリのディレクトリの登録について話したとき、パスを保存しただけだと説明しました。 $fallbackDirsPsr4 属性. 詳細については、次のステップで説明します。 ThinkPHP の Loader の自動ロードを理解する方法

ソース コードを読む唯一の方法は、それを実装して表示することです

ここに図の説明を挿入してくださいThinkPHP の Loader の自動ロードを理解する方法

定義されたクラスがインクルードされている場合、インクルードされます。 autoload は自動ローディングを実行します。

また、findFile メソッドに入ります。

このコードは、findFile で確認できます。この属性はよく知られていますが、extend ディレクトリが自動的にロードされるときに $fallbackDirsPsr4 属性に追加されます。 ThinkPHP の Loader の自動ロードを理解する方法

#findFile でパラメーター クラスを出力するときに、データを確認してください。

ThinkPHP の Loader の自動ロードを理解する方法test\Kaka クラスがはっきりとわかります

ThinkPHP の Loader の自動ロードを理解する方法#この時点で、$fallbackDirsPsr4 属性で返されたファイルを出力します。

ThinkPHP の Loader の自動ロードを理解する方法

次に、__include_file を使用して D を直接含めます。 :\phpstudy_pro\WWW\ThinkPHPSourceCodeAnalysis\kaka\test\Kaka.php 定義したファイル。

上記のカスタム ファイルはどのようにしてクラスの自動ロードを実現しており、extend のロード メソッドでもあります。ThinkPHP の Loader の自動ロードを理解する方法

(推奨学習:

thinkphp5

)

以上がThinkPHP の Loader の自動ロードを理解する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.imで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。