Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';PHP中自动加载的原理是什么?_Php_Spl Autoload Register - Fatal编程技术网

什么';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;