PHP のオートロードの原理は何ですか?
-
21-09-2019 - |
質問
spl_autoload_register
このような仕事はできますが、そのような仕事はどのように行われるのかわかりません。
spl_autoload_register(array('Doctrine', 'autoload'));
解決
基本的な考え方は「書く必要はない」 include
/require
もう指示:未定義のクラスを使用しようとすると、PHP はオートローダーを呼び出します。
したがって、オートローダーの仕事は、どのファイルをロードする必要があるかを決定することです。 include
したがって、クラスが定義されます。
PHP は、あたかもあなたがそのクラスを作成したかのように、そのクラスを使用できるようになります。 include
この命令は実際にはオートロード機能で実行されています。
「トリック」は、自動ロード機能です。
- クラス名のみを受け取ります
- どのファイルをロードするかを決定する必要があります -- つまりどのファイルにそのクラスが含まれているか。
これが、PEAR などの名前付け規則の理由であり、次のようなクラスを指定します。 Project_SubProject_Component_Name
のようなファイルにマッピングされます。 Project/SubProject/Component/Name.php
-- つまり'_
クラス名の「」はスラッシュに置き換えられます (ディレクトリ、サブディレクトリ) ファイルシステム上で。
たとえば、これを見てみると、 Doctrine_Core::autoload
このメソッドは、あなたの場合オートローダーとして呼び出されるメソッドであり、コードのこの部分が含まれています (いくつかの具体的なケースに対処した後) :
$class = self::getPath()
. DIRECTORY_SEPARATOR .
str_replace('_', DIRECTORY_SEPARATOR, $className)
. '.php';
if (file_exists($class)) {
require $class;
return true;
}
return false;
これは、クラス名がファイルシステムにマップされ、 ' が置き換えられることを意味します。_
' による '/
' と最後の文を追加します .php
ファイル名に。
たとえば、を使用しようとしている場合、 Doctrine_Query_Filter_Chain
クラスであり、PHP では認識されません。 Doctrine_Core::autoload
関数が呼び出されます。ロードすべきファイルが Doctrine/Query/Filter/Chain.php
;そのファイルが存在すると、それがインクルードされます。これは、PHP がそのファイルを「認識」していることを意味します。 Doctrine_Query_Filter_Chain
クラス。