0

spl_autoload_registerこの種の仕事はできますが、その種の仕事がどのように行われるのかわかりません。

spl_autoload_register(array('Doctrine', 'autoload'));
4

1 に答える 1

6

include基本的な考え方は、 /命令をもう書く必要がないということrequireです: 定義されていないクラスを使おうとするときはいつでも、PHP はオートローダーを呼び出します。

オートローダーの仕事は、どのファイルをロードするかを決定することでありinclude、それによってクラスが定義されます。

includeその後、PHPは、実際にはオートロード関数で実行された命令を記述したかのように、そのクラスを使用できます。


「トリック」は、オートローディング機能です:

  • クラスの名前だけを受け取ります
  • どのファイルをロードするか、つまりどのファイルにそのクラスが含まれているかを決定する必要があります。

これが、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.phpDoctrine_Query_Filter_Chainそのファイルが存在するので、それが含まれます。これは、PHP がクラスを「認識する」ことを意味します。

于 2010-02-20T17:02:26.670 に答える