在学习php的autoload的机制的时候,发现目前都使用了spl_autoload_register()函数来实现自动加载类,但在查阅资料的过程中,发现了spl_autload()这个函数,在php官方手册中,对该函数的解释是:
__autoload()
函数的默认实现
该函数的例子中看到该函数的作用是类似于include(),只不过是可以传入第二个参数来设置后缀名。而且spl_autoload()无法指定path(当然可在调用该函数之前调用set_include_path()来指定)
另外看到有些博客说到:
怎样让spl_autoload自动起作用呢,也就是将autoload_func指向spl_autoload?答案是使用spl_autoload_register函数。在PHP脚本中第一次调用spl_autoload_register()时不使用任何参数,就可以将autoload_func指向spl_autoload。
但在我的自己的测试中,发现只调用spl_autoload(),传入想要载入的类名,就可以直接载入了,不需要在之前调用spl_autoload_register()。
我的问题是:
PHP手册中的解释:__autoload()函数的默认实现 该如何理解?
spl_autoload()和spl_autoload_register()的关系?
spl_autoload()函数存在的意义是?
谢谢!
迷茫2017-04-10 16:42:41
__autoload 函数是用来处理自动加载的函数,在 PHP 找不到指定类时就会去调用自动加载类,加载所需要的类。
__autoload 只是一个抽象定义,实现(实现就是定义如何加载,加载的规则是什么,加载的文件是什么等等)是交给用户的,而 spl_autoload 则是 SPL 所定义的 __autoload 一种实现。spl_autoload 函数所实现的加载规则就是去 include paths 中查找对于的类。spl_autoload 遵循是是 psr-0 的载入规则,而 include paths 就是载入时被查询的路径。
其他自己实现的 __autoload 类都可以通过 spl_autoload_register 进行注册,注册之后就可以在需要类时自动调用被注册的方法进行加载了。 spl_autoload 也是 __autoload 的一种实现,按理也是需要注册的,只不过因为是内部的默认实现,所有已经自动注册在 PHP 里了。
spl_autoload 如今来看并没有太多用处,应该是因为历史问题残留在 PHP 中的,目前绝大多数程序都没有使用 spl_autoload 去做自动加载,因为它的规则已经定死,并不适合衍生一些功能。
插一句,因为 PHP 只有一个自动加载方法,所以 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 的自动加载队列。