1。__autoload这是一个自动加载函数。在PHP5中,当我们实例化一个未定义的类时,就会触发这个函数。请参见以下示例:./myClass.php./index.php从上面可以看出这是两个文件。在下面的index.php中,新增了一个类myClass,但是显然这个文件是不存在的。现在会自动调用__autoload函数,并将“myClass”类名字符串作为参数直接传递给__autoload,此时可以将文件导入autoload函数,导入后类会正常初始化。此函数在PHP7.2.0后已弃用。2.spl_autoload_registerspl_autoload_register可以自动注册函数,也就是说当访问PHP文件中不存在的类时,会自动调用函数,然后在函数内部执行函数,看起来和autoload一样。但实际上,spl_autoload_register函数更强大。autoload的参数只是一个函数名,是固定的。而且只能声明一次。使用autoload后,该功能将无法再次使用。请注意:一个项目中只能有一个__autoload,如果PHP在执行过程中遇到两个__autoload,会直接报错。很明显autoload不能满足要求,于是就有了SPL扩展,spl_autoload_register接受一个函数名或者一个闭包,或者一个数组作为参数,在闭包内部可以导入对应的文件。而spl_autoload_register可以注册一个自动加载队列,先注册的会先调用。参数autoload_function要注册的自动加载函数。如果没有提供参数,自动加载的默认实现,函数spl_autoload(),会自动注册。throw该参数设置当autoload_function注册成功失败时spl_autoload_register()是否抛出异常。如果prepend为真,spl_autoload_register()会将函数添加到队列的头部而不是尾部。可以与require_once结合使用。如:function_1(){$clsName=str_replace("\\",DIRECTORY_SEPARATOR,$class_name);if(is_file(__DIR__.DIRECTORY_SEPARATOR."src".DIRECTORY_SEPARATOR.$clsName.'.php')){//文件里面有个类,类名TestClass_1require_once(__DIR__.DIRECTORY_SEPARATOR."src".DIRECTORY_SEPARATOR.$clsName.'.php');}}function_2(){$clsName=str_replace("\\",DIRECTORY_SEPARATOR,$class_name);if(is_file(__DIR__.DIRECTORY_SEPARATOR."Module".DIRECTORY_SEPARATOR.$clsName.'.php')){//文件里面有一个名为TestClass_2的类require_once(__DIR__.DIRECTORY_SEPARATOR."Module".DIRECTORY_SEPARATOR.$clsName.'.php');}}spl_autoload_register('function_1');spl_autoload_register('function_2');$obj=newTestClass_2();//当前没有TestClass_2类,所以自动调用function_1,导入文件,但是导入的文件中仍然没有TestClass_2类,所以自动调用function_2,导入文件,进行正常初始化此时。3.其他相关SPL函数3.1spl_autoload_call该函数要求用户显式调用所有已注册的自动加载函数。在spl_autoload_register之后起作用。只需传入函数名称即可。您可以手动导入文件。3.2spl_autoload_functions可以获取所有注册的autoload函数,在spl_autoload_register之后也有效。3.3spl_autoload_extensions注册并返回spl_autoload函数使用的默认文件扩展名,但是这个接口和spl_autoload函数用处不大。spl_autoload是autoload的默认实现,也就是说spl_autoload又对autoload进行了封装。默认情况下,此函数首先将类名转换为小写,然后将.inc或.php的扩展名添加到小写类名作为文件名,然后在所有包含路径中检查该文件是否存在。__autoload函数是用来处理自动加载的函数。当PHP找不到指定的类时,会调用自动加载类来加载需要的类。__autoload只是一个抽象的定义,实现(实现就是定义如何加载,加载的规则是什么,加载的文件是什么等)交给用户,而spl_autoload是一个实现SPL定义的自动加载。spl_autoload函数实现的加载规则是在include路径中寻找对应的类。spl_autoload遵循psr-0的加载规则,includepaths是加载时查询的路径。其他自己实现的autoload类可以通过spl_autoload_register注册。注册后,可以在需要类的时候自动调用注册的方法进行加载。spl_autoload也是autoload的一个实现,按道理是需要注册的,但是因为是内部默认实现,所以在PHP中都已经自动注册了。spl_autoload现在用处不大,应该是PHP遗留下来的历史问题,目前大部分程序都没有使用spl_autoload进行自动加载,因为它的规则已经固定,不适合派生一些函数。因为PHP只有一个autoload方法,SPL的spl_autoload和spl_autoload_register要竞争这个方法,所以在SPL的C实现中使用了很多折衷方案。当spl_autoload_register没有注册自定义自动加载函数时,PHP的自动加载方法挂在spl_autoload下,当spl_autoload_register注册了自动加载函数后,PHP的自动加载方法挂在spl_autoload_call下,spl_autoload也会成为候选者进入spl_autoload_register的自动加载队列。
