質問

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 クラス。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top