PHP中自动加载的原理是什么?

时间:2010-02-20 16:59:21

标签: php spl-autoload-register

spl_autoload_register可以做这种工作,但我不明白这种工作是怎么做的?

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

1 个答案:

答案 0 :(得分:6)

基本思想是您不必再编写include / require指令了:每当您尝试使用未定义的类时,PHP都会调用自动加载器。

然后,自动加载器的工作是确定应加载哪个文件,并include,以便定义类。

然后PHP可以使用该类,就好像您是编写include指令的人一样,实际上已经在自动加载功能中执行了。


“技巧”是自动加载功能:

  • 仅接收班级名称
  • 必须确定要加载的文件 - 即哪个文件包含该类。

这就是命名约定的原因,例如PEAR,它表示诸如Project_SubProject_Component_Name之类的类被映射到Project/SubProject/Component/Name.php之类的文件 - 即“_”类名由文件系统上的斜杠(目录,子目录)替换。


例如,如果您查看Doctrine_Core::autoload方法,即在您的情况下将被称为自动加载器的方法,它将包含此部分代码(在处理某些特定情况后)< / em>:

$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类。