- 1.composer がディレクトリであるかどうかを確認します
##2. パスの下の autoload_static.php がファイルであるかどうかを確認します 3. autoload_static.php ファイルを導入します 4. 宣言されたすべてのクラスを配列で返します return5. 最後のクラスを取得しますComposerStaticInit30742487e00917c888d89ba216f165b9-
#6. 配列内のデータが ComposerStaticInit30742487e00917c888d89ba216f165b9
-
##に存在するかどうかを確認します。その後、vendor\composer\autoload_static に移動できます。 .php ファイル。これら 2 つの属性を参照してください
これは、おそらく一部の学生がここで使用するであろうコードです self::${$attr} = $composerClass::${$attr};
、これが $attr
is'prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files'
これらのデータについては、 に を追加します外層の $
シンボル。
したがって、対応する属性値は ComposerStaticInit30742487e00917c888d89ba216f165b9
クラスで直接取得されます。これは、上の図の 2 つの属性値です。
1-3 名前空間を登録します
ファイルは thinkphp\library\think\Loader.php
の
register メソッドのままで、2 つのコマンド スペースが登録されています。はそれぞれ思考と特性です。次に、addNamespace メソッドを入力します。addNamespace
メソッドでは、Psr4 スペース
が追加されます。次に、addPsr4 メソッドに進みます。このメソッドは、両方の名前空間を ComposerStaticInit1e269472f484e157e90227b420ffca7a クラスの $prefixLengthsPsr4 プロパティと $prefixDirsPsr4 プロパティに登録します
#以上、デバッグ用にブレークポイントを作成しました このデータを見れば一目瞭然ですが、traits についても同様の登録方法を使用しています。
これで名前空間が登録されましたので、次に psr4 名前空間とは何かを勉強してみましょう。
1-4 Psr4 とは何ですか
psr は単純にファイル パスとして認識され、自動的に対応するクラスの関連仕様をロードします。現在、TP5.1 は psr4 仕様を使用しています。ここでのクラスは、クラス、インターフェイス、およびスーパー クラスの構造を指します。完全なクラスには次の構造が必要です。 \(\)*\
次の仕様は PHP ドキュメントから引用しています
完全なクラス名には、「ベンダー名前空間」と呼ばれる最上位の名前空間が必要です。
完全なクラス名クラス名には 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 がエラーを報告する前にこの関数がトリガーされ、未定義のクラス名がパラメータとして渡されて、直接実行think\\Loader::autoload
このメソッド
ブレークポイント後の最初にアンロードされたクラスは think\Error
なぜ think\Error なのか! thinkphp/base.php
に戻って見てみましょう。自動ロードが完了すると、最初に実行されるクラスは Error
です。このエラーを Kaka に変更して印刷し、クラスを Kaka に変更します。この時点で、誰もがこのクラスの自動読み込みメカニズムをある程度理解しています。
使用するクラスが導入されていない場合、このクラスは thinkphp/library/think/Loader.php
の autoload
メソッドにパラメータとして渡されます。
ここに来て、自動ロード メソッドを見てみましょう
findFile メソッドから始めて、名前のないクラスをこのメソッドに渡します。 think\Error クラスによって、classMap 属性から直接返されます
autoload
のfile
変数にthink\Errorクラスのフルパスを返した後、一度win環境の場合を判定します。
次に、include
を直接使用して、ファイルが返されるまでファイルを導入します。
ここまでは、クラスの完全な自動ロードと分析です。
これで終わりですが、まだ言及しなければならないことが 1 つあります。属性 $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というファイルを導入します
この時、このクラスは必ずエラーを報告するのでどうすればよいでしょうか直接アクセスするには? 毛糸です。
この時点で、ソース コードの重要性が明らかになります。レジスタを自動的にロードすることを忘れないでください。 .
関数では、extend ディレクトリがロードされます
この時点で、 kaka ディレクトリに直接アクセスしてください。
問題ありません。直接表示されます。すべて問題ありません。ここでは、extent のロード方法について説明します。
自動ロード クラス ライブラリのディレクトリの登録について説明したとき、$fallbackDirsPsr4 へのパスを保存しただけであると説明しました。
属性にはありません。詳しく説明します。次のステップでは、これらについて説明します。
ソース コードを読む唯一の方法は、それを実装して確認することです
同じことが起こります
findFile メソッドを入力してください
このコードは findFile メソッドで見ることができます。この属性についてご存知ですか?この属性は、 extend ディレクトリは自動的にロードされます。$fallbackDirsPsr4 属性。
findFile でパラメータ クラスを出力するときにデータを確認してください。
test\Kakaこのクラス
がはっきりとわかります。この時点で、$fallbackDirsPsr4
属性で返されたファイルを出力します。
次に、__include_file
を使用してそれを直接含めます。 D:\phpstudy_pro\WWW\ThinkPHPSourceCodeAnalysis\kaka\test\Kaka.php
私たちが定義したファイル。
上記のカスタムファイルはクラスの自動ロードをどのように実現しているのか、それが extend
のロードメソッドです。 4. まとめ
クラスの自動ロードに関するすべての処理が完了しました。間違いがあれば、コメント欄に残してください。
❝学習の継続、ブログの継続、共有の継続は、カカがそのキャリア以来常に支持してきた信念です。巨大なインターネット上のカカの記事がそうであることを願っています。少し持ってきてください助けてください。私の名前はカカです。また次回お会いしましょう。
❞