ThinkPHP はローダーのソースコード分析を自動的にロードします

咔咔
リリース: 2020-09-16 10:37:47
オリジナル
2479 人が閲覧しました

ずっと考えていたのですが、やっと連載記事を書き始めましたので、プロモーションやインタビューにも対応できるような記事を連載していきたいと思っています。 この記事を読んで、カカが書いていない注目のインタビュー質問や技術的な問題を見つけた場合は、コメント欄で指摘して一緒に改善してください。

はじめに

現在、PHP の高度なロードマップを整理中です。良い提案があれば、Kaka ができるだけ早く提案します。

#1. 自動読み込みローダーのソース コード分析

##1-1 学習目標

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

1- 2 Composer の読み込み

#ここに画像の説明を挿入ThinkPHP はローダーのソースコード分析を自動的にロードします
上の画像をクリックしてくださいKa によって与えられた分析図では、最初にローダー クラスがbase.php にロードされ、次に register メソッドが呼び出されます。

ThinkPHP はローダーのソースコード分析を自動的にロードしますthinkphp\library\think\Loader.phpに来てください。register メソッドがあります。このメソッドでは、まず最初の知識ポイントを学習しますspl_autoload_register()過去と現在の生活、および spl_autoload_register の簡単な使用法について話します。 直接クリックして表示します。

次のステップは、プロジェクトのルート パスとコンポーザーのパスです。

ThinkPHP はローダーのソースコード分析を自動的にロードします
ここに画像の説明を挿入
ここからはコンポーザー ファイルがロードされ、プロセスは非常に簡単です

  • 1.composer がディレクトリであるかどうかを確認します
  • ##2. パスの下の autoload_static.php がファイルであるかどうかを確認します
  • 3. autoload_static.php ファイルを導入します
  • 4. 宣言されたすべてのクラスを配列で返します return
  • 5. 最後のクラスを取得しますComposerStaticInit30742487e00917c888d89ba216f165b9
  • #6. 配列内のデータが ComposerStaticInit30742487e00917c888d89ba216f165b9
  • ##に存在するかどうかを確認します。その後、vendor\composer\autoload_static に移動できます。 .php ファイル。これら 2 つの属性を参照してください
  • ThinkPHP はローダーのソースコード分析を自動的にロードしますこれは、おそらく一部の学生がここで使用するであろうコードです self::${$attr} = $composerClass::${$attr};、これが $attr is'prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files'これらのデータについては、 に を追加します外層の $ シンボル。

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

    ThinkPHP はローダーのソースコード分析を自動的にロードします
    ここに画像の説明を挿入します

    1-3 名前空間を登録します

    ファイルは thinkphp\library\think\Loader.php

    register

    メソッドのままで、2 つのコマンド スペースが登録されています。はそれぞれ思考と特性です。次に、addNamespace メソッドを入力します。ThinkPHP はローダーのソースコード分析を自動的にロードしますaddNamespace メソッドでは、Psr4 スペース

    が追加されます。

    ThinkPHP はローダーのソースコード分析を自動的にロードします次に、addPsr4 メソッドに進みます。このメソッドは、両方の名前空間を ComposerStaticInit1e269472f484e157e90227b420ffca7a クラスの $prefixLengthsPsr4 プロパティと $prefixDirsPsr4 プロパティに登録します

    #以上、デバッグ用にブレークポイントを作成しました このデータを見れば一目瞭然ですが、ThinkPHP はローダーのソースコード分析を自動的にロードしますtraits についても同様の登録方法を使用しています。

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

    ThinkPHP はローダーのソースコード分析を自動的にロードします

    1-4 Psr4 とは何ですか

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

    ここでのクラスは、クラス、インターフェイス、およびスーパー クラスの構造を指します。

    完全なクラスには次の構造が必要です。

    \(\)*\

    次の仕様は PHP ドキュメントから引用しています

    • 完全なクラス名には、「ベンダー名前空間」と呼ばれる最上位の名前空間が必要です。

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

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

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

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

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

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

    ThinkPHP はローダーのソースコード分析を自動的にロードします

    1-5 クラス ライブラリ マッピング ファイルのロード

    #この時点で、必ず疑問が生じます。なぜそうなるのかということです。ここに classmap.php はありませんか? このファイル。 ThinkPHP はローダーのソースコード分析を自動的にロードします慌てず、パニックにならず、まず実行してくださいphp think optimize:autoloadファイルを取り出しますThinkPHP はローダーのソースコード分析を自動的にロードします最終的には、addClassMapメソッドに到達します。 classmap.phpこのファイルのデータは $classMap に割り当てられるだけで、他の用途はありませんThinkPHP はローダーのソースコード分析を自動的にロードします

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

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

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

    ThinkPHP はローダーのソースコード分析を自動的にロードしますメソッドでは、拡張パスは $ にのみ割り当てられます。 fallbackDirsPsr4. この属性。

    ThinkPHP はローダーのソースコード分析を自動的にロードしますここまでLoader::register();この部分は終了です。その後、内部実装と実際のケースを詳しく見ていきます。

    上記の読み取りソースコードには 4 つの属性があります。簡単に整理してみましょう

    ThinkPHP はローダーのソースコード分析を自動的にロードします
    ここに画像の説明を挿入

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

    ThinkPHP はローダーのソースコード分析を自動的にロードします
    ここに画像の説明を挿入

    ここにソース コードの解析を開始したばかりの関数がありますspl_autoload_register

    使用するクラスが導入されていない場合、PHP がエラーを報告する前にこの関数がトリガーされ、未定義のクラス名がパラメータとして渡されて、直接実行think\\Loader::autoloadこのメソッド

    ThinkPHP はローダーのソースコード分析を自動的にロードしますブレークポイント後の最初にアンロードされたクラスは think\Error

    ThinkPHP はローダーのソースコード分析を自動的にロードしますなぜ think\Error なのか! thinkphp/base.php に戻って見てみましょう。自動ロードが完了すると、最初に実行されるクラスは Error

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

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

    ThinkPHP はローダーのソースコード分析を自動的にロードしますここに来て、自動ロード メソッドを見てみましょう

    ThinkPHP はローダーのソースコード分析を自動的にロードしますfindFile メソッドから始めて、名前のないクラスをこのメソッドに渡します。 think\Error クラスによって、classMap 属性から直接返されます

    ThinkPHP はローダーのソースコード分析を自動的にロードしますautoloadfile変数にthink\Errorクラスのフルパスを返した後、一度win環境の場合を判定します。

    次に、include を直接使用して、ファイルが返されるまでファイルを導入します。

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

    ThinkPHP はローダーのソースコード分析を自動的にロードしますこれで終わりですが、まだ言及しなければならないことが 1 つあります。属性 $classMap、この属性はファイル classmap.php に基づいています。このファイルを生成するには、コマンド php think optimize:autoload を実行する必要もあります。

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

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

    現時点では、コードは絶対に classMap に移動しません

    ThinkPHP はローダーのソースコード分析を自動的にロードします最初に think\Error ファイルを取得します

    ThinkPHP はローダーのソースコード分析を自動的にロードします次に、Composer の自動読み込みの 2 つの属性を通じて名前空間を取得し、think\Error.php ファイルを結合します

    ThinkPHP はローダーのソースコード分析を自動的にロードします返される最終結果は、ファイル #D:\phpstudy_pro\WWW\ThinkPHPSourceCodeAnalysis\thinkphp\library\think\Error.php です。

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

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

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

    最初にフォルダー kaka

    を作成します

    ThinkPHP はローダーのソースコード分析を自動的にロードしますこのとき、直接アクセスするために、コントローラーのインデックスにKaka.phpというファイルを導入します

    ThinkPHP はローダーのソースコード分析を自動的にロードします この時、このクラスは必ずエラーを報告するのでどうすればよいでしょうか直接アクセスするには? 毛糸です。

    ThinkPHP はローダーのソースコード分析を自動的にロードします
    ここに画像の説明を挿入

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

    ThinkPHP はローダーのソースコード分析を自動的にロードします
    ここに画像の説明を挿入します

    この時点で、 kaka ディレクトリに直接アクセスしてください。

    ThinkPHP はローダーのソースコード分析を自動的にロードします問題ありません。直接表示されます。すべて問題ありません。ThinkPHP はローダーのソースコード分析を自動的にロードしますここでは、extent のロード方法について説明します。

    自動ロード クラス ライブラリのディレクトリの登録について説明したとき、$fallbackDirsPsr4 へのパスを保存しただけであると説明しました。 属性にはありません。詳しく説明します。次のステップでは、これらについて説明します。

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

    ThinkPHP はローダーのソースコード分析を自動的にロードします
    #ここに画像の説明を挿入
    #定義されたクラスが入力されている限り、自動ロードのために自動ロードされます

    同じことが起こります

    findFile

    メソッドを入力してください

    このコードは findFile メソッドで見ることができます。この属性についてご存知ですか?この属性は、 extend ディレクトリは自動的にロードされます。$fallbackDirsPsr4

    属性。 ThinkPHP はローダーのソースコード分析を自動的にロードしますfindFile でパラメータ クラスを出力するときにデータを確認してください。

    test\KakaThinkPHP はローダーのソースコード分析を自動的にロードしますこのクラス

    がはっきりとわかります。

    ThinkPHP はローダーのソースコード分析を自動的にロードしますThinkPHP はローダーのソースコード分析を自動的にロードしますこの時点で、$fallbackDirsPsr4 属性で返されたファイルを出力します。

    ThinkPHP はローダーのソースコード分析を自動的にロードします次に、__include_file を使用してそれを直接含めます。 D:\phpstudy_pro\WWW\ThinkPHPSourceCodeAnalysis\kaka\test\Kaka.php私たちが定義したファイル。

    上記のカスタムファイルはクラスの自動ロードをどのように実現しているのか、それが extend

    のロードメソッドです。 4. まとめ

    クラスの自動ロードに関するすべての処理が完了しました。間違いがあれば、コメント欄に残してください。

    学習の継続、ブログの継続、共有の継続は、カカがそのキャリア以来常に支持してきた信念です。巨大なインターネット上のカカの記事がそうであることを願っています。少し持ってきてください助けてください。私の名前はカカです。また次回お会いしましょう。

以上がThinkPHP はローダーのソースコード分析を自動的にロードしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート