什么';PHP中自动加载的原理是什么?
什么';PHP中自动加载的原理是什么?,php,spl-autoload-register,Php,Spl Autoload Register,spl\u autoload\u register可以做这种工作,但我不明白这种工作是如何完成的 spl_autoload_register(array('Doctrine', 'autoload')); 基本思想是,您不必再编写include/require指令:无论何时尝试使用未定义的类,PHP都将调用自动加载程序 那么,自动加载程序的任务就是确定应该加载哪个文件,并包含它,这样类就被定义了 PHP然后可以使用该类,就好像您是编写include指令的人一样,该指令实际上已在自动加载函数中执
spl\u autoload\u register
可以做这种工作,但我不明白这种工作是如何完成的
spl_autoload_register(array('Doctrine', 'autoload'));
基本思想是,您不必再编写
include
/require
指令:无论何时尝试使用未定义的类,PHP都将调用自动加载程序
那么,自动加载程序的任务就是确定应该加载哪个文件,并包含它,这样类就被定义了
PHP然后可以使用该类,就好像您是编写include
指令的人一样,该指令实际上已在自动加载函数中执行
“诀窍”在于自动加载功能:
- 仅接收类的名称
- 必须确定要加载的文件,即,哪个文件包含该类
这就是命名约定的原因,例如PEAR约定,它表示类(如Project\u SubProject\u Component\u Name
)映射到文件系统中的文件(如Project/SubProject/Component/Name.php
),即类名中的“”被文件系统上的斜杠(目录、子目录)替换
例如,如果您查看一下Doctrine\u Core::autoload
方法,该方法在您的案例中将被称为自动加载器,它包含这部分代码(在处理一些特定案例之后):
这意味着类名被映射到文件系统,用“/
”替换“”,并向文件名添加一个最终的.php
”
例如,如果您试图使用doctor\u Query\u Filter\u Chain
类,并且PHP不知道该类,那么将调用doctor\u Core::autoload
函数;它将确定应该加载的文件是doctor/Query/Filter/Chain.php
;由于该文件的存在,它将被包括在内——这意味着PHP现在“知道”了原则、查询、过滤链
类。基本思想是,您不必再编写包含
/要求
说明:无论何时尝试使用未定义的类,PHP都会调用自动加载器
那么,自动加载程序的任务就是确定应该加载哪个文件,并包含它,这样类就被定义了
PHP然后可以使用该类,就好像您是编写include
指令的人一样,该指令实际上已在自动加载函数中执行
“诀窍”在于自动加载功能:
- 仅接收类的名称
- 必须确定要加载的文件,即,哪个文件包含该类
这就是命名约定的原因,例如PEAR约定,它表示类(如Project\u SubProject\u Component\u Name
)映射到文件系统中的文件(如Project/SubProject/Component/Name.php
),即类名中的“”被文件系统上的斜杠(目录、子目录)替换
例如,如果您查看一下Doctrine\u Core::autoload
方法,该方法在您的案例中将被称为自动加载器,它包含这部分代码(在处理一些特定案例之后):
这意味着类名被映射到文件系统,用“/
”替换“”,并向文件名添加一个最终的.php
”
例如,如果您试图使用doctor\u Query\u Filter\u Chain
类,并且PHP不知道该类,那么将调用doctor\u Core::autoload
函数;它将确定应该加载的文件是doctor/Query/Filter/Chain.php
;由于该文件的存在,它将被包括在内——这意味着PHP现在“知道”了doctor\u Query\u Filter\u Chain
类。如果注册了许多类,会执行所有类还是只执行一个匹配的doctor
?如果有几个自动加载函数注册了spl\u autoload\u register
,您将有一个自动加载函数的“队列”。PHP将(引用)“按照定义的顺序遍历它们”;;;这意味着将调用第一个函数;如果类仍然不存在,则调用第二个类;依此类推——与类名无关。在我之前的评论中添加一点信息:您使用的“条令”
字符串仅意味着您正在注册的自动加载函数是条令
类中的静态方法自动加载
(请参阅此处的“回调”);;;它没有说明autoloader可以自动加载哪些类。我遵循了这个链接,似乎spl\u autoload\u register
不接受数组作为参数,但为什么上面的方法仍然有效?spl\u autoload\u register
接受“回调”作为其第一个参数;一个数组包含一个类名作为第一个元素,一个静态方法名作为第二个元素,这是一个有效的回调——请参阅我在第二条注释中发布的链接。如果注册了许多类,该怎么办,是否将执行所有这些功能或仅执行一个匹配的原则
?如果您有多个自动加载功能注册到spl\u autoload\u register
,您将有一个自动加载功能的“队列”。PHP将(引用)“按照定义的顺序遍历它们”;;;这意味着将调用第一个函数;如果类仍然不存在,则调用第二个类;依此类推——与类名无关。在我之前的评论中添加一点信息:您使用的“条令”
字符串仅意味着您正在注册的自动加载函数是条令
类中的静态方法自动加载
(请参阅此处的“回调”);;;它没有说任何关于autoloader将是什么类的内容
$class = self::getPath()
. DIRECTORY_SEPARATOR .
str_replace('_', DIRECTORY_SEPARATOR, $className)
. '.php';
if (file_exists($class)) {
require $class;
return true;
}
return false;