spl_autoload_register
可以做这种工作,但我不明白这种工作是怎么做的?
spl_autoload_register(array('Doctrine', 'autoload'));
答案 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
类。