❝ずっと考えていたのですが、やっと連載記事を書き始めましたので、プロモーションやインタビューにも対応できるような記事を連載していきたいと思っています。 この記事を読んで、カカが書いていない注目のインタビュー質問や技術的な問題を見つけた場合は、コメント欄で指摘して一緒に改善してください。
❞
現在、PHP の高度なロードマップを整理中です。良い提案があれば、Kaka ができるだけ早く提案します。
thinkphp\library\think\Loader.php
に来てください。register メソッドがあります。このメソッドでは、まず最初の知識ポイントを学習します
spl_autoload_register()過去と現在の生活、および spl_autoload_register の簡単な使用法について話します。 直接クリックして表示します。
これは、おそらく一部の学生がここで使用するであろうコードです
self::${$attr} = $composerClass::${$attr};
、これが $attr
is'prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files'
これらのデータについては、 に を追加します外層の $
シンボル。
したがって、対応する属性値は ComposerStaticInit30742487e00917c888d89ba216f165b9
クラスで直接取得されます。これは、上の図の 2 つの属性値です。
ファイルは thinkphp\library\think\Loader.php
の
メソッドのままで、2 つのコマンド スペースが登録されています。はそれぞれ思考と特性です。次に、addNamespace メソッドを入力します。addNamespace
メソッドでは、Psr4 スペース
次に、addPsr4 メソッドに進みます。このメソッドは、両方の名前空間を
ComposerStaticInit1e269472f484e157e90227b420ffca7a クラスの $prefixLengthsPsr4 プロパティと $prefixDirsPsr4 プロパティに登録します
#以上、デバッグ用にブレークポイントを作成しました このデータを見れば一目瞭然ですが、traits
についても同様の登録方法を使用しています。
\
完全なクラス名には、「ベンダー名前空間」と呼ばれる最上位の名前空間が必要です。
完全なクラス名クラス名には 1 つ以上のサブ名前空間を含めることができます;
完全なクラス名には最終クラス名が必要です;
完全なクラス名のどの部分のアンダースコアにも特別な意味はありません。
#この時点で、必ず疑問が生じます。なぜそうなるのかということです。ここに classmap.php はありませんか? このファイル。 慌てず、パニックにならず、まず実行してください
php think optimize:autoload
ファイルを取り出します最終的には、
addClassMap
メソッドに到達します。 classmap.php
このファイルのデータは $classMap
に割り当てられるだけで、他の用途はありません
下の図からわかるように、addAutoLoadDir
メソッドを使用してロードされます。
メソッドでは、拡張パスは
$ にのみ割り当てられます。 fallbackDirsPsr4.
この属性。
ここまで
Loader::register();
この部分は終了です。その後、内部実装と実際のケースを詳しく見ていきます。
上記の読み取りソースコードには 4 つの属性があります。簡単に整理してみましょう
ここにソース コードの解析を開始したばかりの関数があります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
です。
ここのコードは注意深く読む必要があります。
クラスの自動ロードはここで完全に終了です。
最初にフォルダー kaka
を作成しますこのとき、直接アクセスするために、コントローラーのインデックスにKaka.phpというファイルを導入します
この時、このクラスは必ずエラーを報告するのでどうすればよいでしょうか直接アクセスするには? 毛糸です。
この時点で、ソース コードの重要性が明らかになります。レジスタを自動的にロードすることを忘れないでください。 .
関数では、extend ディレクトリがロードされます
この時点で、 kaka ディレクトリに直接アクセスしてください。
問題ありません。直接表示されます。すべて問題ありません。
ここでは、extent のロード方法について説明します。
自動ロード クラス ライブラリのディレクトリの登録について説明したとき、$fallbackDirsPsr4 へのパスを保存しただけであると説明しました。
属性にはありません。詳しく説明します。次のステップでは、これらについて説明します。
ソース コードを読む唯一の方法は、それを実装して確認することです
同じことが起こります
findFile メソッドを入力してください
属性。 findFile でパラメータ クラスを出力するときにデータを確認してください。
test\Kakaこのクラス
この時点で、
$fallbackDirsPsr4
属性で返されたファイルを出力します。
次に、
__include_file
を使用してそれを直接含めます。 D:\phpstudy_pro\WWW\ThinkPHPSourceCodeAnalysis\kaka\test\Kaka.php
私たちが定義したファイル。
上記のカスタムファイルはクラスの自動ロードをどのように実現しているのか、それが extend
クラスの自動ロードに関するすべての処理が完了しました。間違いがあれば、コメント欄に残してください。
❝学習の継続、ブログの継続、共有の継続は、カカがそのキャリア以来常に支持してきた信念です。巨大なインターネット上のカカの記事がそうであることを願っています。少し持ってきてください助けてください。私の名前はカカです。また次回お会いしましょう。
❞
以上がThinkPHP はローダーのソースコード分析を自動的にロードしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。