理解 Composer 自动加载——spl_autoload_register ()
概念
spl_autoload_register()
可以注册任意数量的自动加载器,当尚未被定义的类(class)和接口(interface)被使用时,脚本引擎会尝试在PHP出错之前通过自动加载器来加载所需要的类。
使用形式
spl_autoload_register(callable $autoload_function , bool $throw = true, bool $prepend = false)
参数
callable $autoload_function
欲注册自动装载函数。可以是方法名、闭包函数。如果想要使用到类中的静态方法,可以使用如下形式方法注册:
// 数组中第一个元素为类名,第二个元素为该类的静态方法名
$autoload_function = ['YourClass', 'yourStaticFunction'];
如果我们在程序中已经实现了 __autoload()
方法,它必须被显式注册到 __autoload()
队列中。因为 spl_autoload_register()
函数会将Zend Engine中的 __autoload()
函数取代为 spl_autoload()
或 spl_autoload_call()
。(一般情况下我们不会实现 __autoload()
方法,而是统一把 spl_autoload_register()
作为自动加载的最佳实践)
bool $throw = true
当 $autoload_function
出现错误时,是否抛出异常。
bool $prepend = false
若该值为 true
,表示会将注册的函数 $autoload_function
放入队列首部;若值为 false
,则放入队列尾部。
相关函数
__autoload(string $class)
尝试加载未定义的类时,会自动执行该方法。(缺点,只能使用一次,所以一般使用 spl_autoload_register()
)
spl_autoload(string $class_name, string $file_extensions)
类加载的默认实现。若不使用任何参数调用 spl_autoload_register()
,则以后再进行 __autoload()
调用时自动使用此函数。(相当于替代了 require
/ include
)
注意在使用时需要配合以下函数:
spl_autoload_extensions()
:注册并返回 spl_autoload()
函数使用的默认文件扩展名。
set_include_path()
:设置 include_path
配置选项。
案例如下:
function autoload($className) {
set_include_path('./library/classes/');
spl_autoload($className); //replaces include/require
}
spl_autoload_extensions('.class.php');
spl_autoload_register('autoload');
个人理解
大致过程如下:
1. 通过 spl_autoload_function()
注册函数,将函数插入到队列尾部。(若指定第三个参数为 true
,则为插入至队首)
2. 每次实现一个类或接口,脚本引擎会从首到尾依次执行队列里边注册好的函数,直到找到为止。若某个函数执行后能够找到该类或接口,则后续的函数不会再执行。
本作品采用《CC 协议》,转载必须注明作者和本文链接