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

use*_*729 0 php spl-autoload-register

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

spl_autoload_register(array('Doctrine', 'autoload'));
Run Code Online (Sandbox Code Playgroud)

Pas*_*TIN 6

基本思想是你不必再编写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;
Run Code Online (Sandbox Code Playgroud)

这意味着类名被映射到文件系统,替换' _'by' /',并.php在文件名中添加final .

例如,如果您尝试使用Doctrine_Query_Filter_Chain该类,并且PHP不知道该Doctrine_Core::autoload函数,则将调用该函数; 它将确定应该加载的文件是Doctrine/Query/Filter/Chain.php; 并且当该文件存在时,它将被包含 - 这意味着PHP现在"知道" Doctrine_Query_Filter_Chain该类.