この記事では、thinkphp でのローダーの自動読み込みに関する関連知識を提供します。主に Composer の読み込みに関する関連知識が含まれています。皆様のお役に立てれば幸いです。
1. 自動ロードローダーのソースコード分析
#1-1 学習目標
#ここに画像の説明を挿入します。まず、base.php にローダー クラスをロードし、次に Register this メソッドを呼び出します。 。
thinkphp\library\think\Loader.php にアクセスすると、register メソッドがあります。このメソッドでは、まず最初の知識ポイント spl_autoload_register() を学習し、次のことについて話します。 spl_autoload_過去と現在の生活を登録し、クリックするだけで簡単に使用できます。次のステップは、プロジェクトのルート パスとコンポーザーのパスです。
#ここに画像の説明を挿入
ここからはコンポーザー ファイルの読み込みです。プロセスも非常に簡単です
composer がディレクトリかどうかを判断するファイルは依然として thinkphp\library\think\Loader.php# の register メソッドです##ここでは、think と traits という 2 つのコマンド スペースが登録されています。次に、addNamespace メソッドを入力します。
addNamespace メソッドでは、Psr4 スペースが追加されます。
次に、addPsr4 メソッドに進みます。両方の名前空間は、
ComposerStaticInit1e269472f484e157e90227b420ffca7a クラスの $prefixLengthsPsr4 プロパティと $prefixDirsPsr4 プロパティに登録されています。
上記を確認するには、デバッグ ブレークポイントを作成します。これらのデータを見れば一目瞭然ですが、特性についても登録方法は同じです。 これで名前空間が登録されましたので、次に psr4 名前空間とは何かを勉強してみましょう。1-4 Psr4
psr とは、単にファイル パスと、対応するファイルを自動的にロードするための関連仕様として理解されます。 class 、現在 TP5.1 は psr4 仕様を使用しています。ここでのクラスは、クラス、インターフェイス、およびスーパー クラスの構造を指します
完全なクラスには次の構造が必要です\
完全なクラス名には、というトップレベルの名前空間が必要です。 "vendor namespace";
完全なクラス名には 1 つ以上のサブ名前空間を含めることができます;
完全なクラス名には最終クラスが必要です名前;###
完全なクラス名のどの部分のアンダースコアにも特別な意味はありません。
完全なクラス名は、任意の大文字と小文字で構成できます。
すべてのクラス名では大文字と小文字を区別する必要があります。
以下は公式の例です。この psr 仕様が理解できる方は理解してみてください
1 - 5 クラス ライブラリ マッピング ファイルをロードします。
この時点で、なぜここに classmap.php ファイルがないのかという疑問が必ず出てきます。
#急がず、パニックにならず、まず php think optimize:autoload を実行してファイルを取得します。 ##最終的にはそこに到達します。このメソッドの addClassMap メソッドは、classmap.php ファイルのデータを $classMap に代入するだけであり、他の用途はありません。 ##1-6 extend ディレクトリを自動的にロードするextend このディレクトリは、TP フレームワークを使用しているすべての人が使用し、カスタマイズされたクラス ライブラリ ファイルをこのディレクトリに保存できます。
下の図からわかるように、addAutoLoadDir メソッドを使用してロードします。
メソッドでは、拡張パスを $ に割り当てるだけです。 fallbackDirsPsr4.このプロパティ。
Loader::register(); の部分はこれで終わりです。次に、内部実装と実際のケースを詳しく見ていきます。
上記の読み込みソースコードには 4 つの属性があります。それらを簡単にまとめます。
2. の読み込みプロセスを簡単に説明します。クラス
ここに画像の説明を挿入
ソースの解析を開始しましたコードはここにあります spl_autoload_registerという関数があります 使用するクラスが導入されていない場合、PHPがエラーを報告する前にこの関数がトリガーされます 未定義のクラス名がパラメータとして渡され、 \\Loader::このメソッドを自動ロードしますブレークポイントの後の最初にアンロードされたクラスは think\Error
です##なぜ think\Error なのか! thinkphp/base.php に戻って確認してください。自動読み込みが完了すると、最初に実行されるクラスは Error
です。このエラーを Kaka に変更して印刷し、クラスを Kaka に変更します。この時点で、誰もがこのクラスの自動読み込みメカニズムをある程度理解しています。
使用するクラスが導入されていない場合、このクラスは thinkphp/library/think/Loader.php の autoload メソッドにパラメータとして渡されます。ここで autoload メソッドを見てみましょう
findFile メソッドから始めて、未使用のクラスがこのメソッドに渡されます。findFile メソッドでは、think\Error クラスによってマップされたファイルが classMap 属性から直接返されます。
Return think\ autoloadのfile変数にErrorクラスのフルパスを返すと、win環境のサイズが一度判定されます。
その後、ファイルが返されるまで include を使用してファイルを導入します。 ここまでは、クラスの完全な自動ロードと分析です。これで終わりですが、$classMap 属性についても触れておく必要があります。この属性は、classmap.php ファイルに基づいています。このファイルの生成も必要です。コマンド php think optimize:autoload を実行することによって生成されます。
このファイルが生成されない場合、プログラムはどのように実行されるのでしょうか。これまでの処理はすべて同じで、findFile だけが異なりますので、簡単に整理してみましょう。
現時点ではコードは classMap を通過しません。
最初に think\Error ファイルを取得します
次に、Composer の自動読み込みの 2 つの属性を通じて名前空間を取得し、think\Error.php ファイルを結合します。
返される最終結果も D:\ です。 phpstudy_pro\ WWW\ThinkPHPSourceCodeAnalysis\thinkphp\library\think\Error.php ファイル。
ここのコードは注意深く読む必要があります。
クラスの自動ロードはここで完全に終了です。
3. カスタム ファイルを使用したクラスの自動読み込みを実装する方法
最初にフォルダー kaka を作成します
この時点で、直接アクセスするために、ファイル Kaka.php をコントローラーのインデックスに導入します
この時点で、このクラスは必ずエラーを報告しますでは、どうすればよいでしょうか? クリックするだけで直接アクセスできます。
ここに画像の説明を挿入
この時点で、ソース コードの重要性が明らかになります。自動的にロードされる register 関数では、extend がロードされることに注意してください。ディレクトリ
##ここに画像の説明を挿入##この時点で、kaka ディレクトリを追加し、直接アクセスします
何も問題ありません。直接出てきました。すべてOKです。エクステントのロード方法について話しましょう。
自動ロードクラスライブラリのディレクトリの登録について話したとき、パスを保存しただけだと説明しました。 $fallbackDirsPsr4 属性. 詳細については、次のステップで説明します。
ソース コードを読む唯一の方法は、それを実装して表示することですここに図の説明を挿入してください
定義されたクラスがインクルードされている場合、インクルードされます。 autoload は自動ローディングを実行します。また、findFile メソッドに入ります。このコードは、findFile で確認できます。この属性はよく知られていますが、extend ディレクトリが自動的にロードされるときに $fallbackDirsPsr4 属性に追加されます。
#findFile でパラメーター クラスを出力するときに、データを確認してください。test\Kaka クラスがはっきりとわかります
#この時点で、$fallbackDirsPsr4 属性で返されたファイルを出力します。
次に、__include_file を使用して D を直接含めます。 :\phpstudy_pro\WWW\ThinkPHPSourceCodeAnalysis\kaka\test\Kaka.php 定義したファイル。
上記のカスタム ファイルはどのようにしてクラスの自動ロードを実現しており、extend のロード メソッドでもあります。
(推奨学習:thinkphp5
)以上がThinkPHP の Loader の自動ロードを理解する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。