php auotload 实现了类的延迟加载机制,需要的时候在include,平时很少用到。它的实现原理搜了一下如下(不是本人研究的结果):
- 检查执行器全局变量函数指针autoload_func是否为NULL。
- 如果autoload_func==NULL, 则查找系统中是否定义有__autoload()函数,如果没有,则报告错误并退出。
- 如果定义了__autoload()函数,则执行__autoload()尝试加载类,并返回加载结果。
- 如果autoload_func不为NULL,则直接执行autoload_func指针指向的函数用来加载类。注意此时并不检查__autoload()函数是否定义。
PHP提供了两种方法来实现自动装载机制,php的autoload,另外 一种就是设计一个函数,将autoload_func指针指向它,这通常使用C语言在PHP扩展中实现。如果既实现了__autoload()函数,又实现了autoload_func(将autoload_func指向某一PHP函数),那么只执行autoload_func函数。
php 的 autoload 不是很灵活,一个项目只有一个!想要实现多种多样的自动加载机制,autoload就好很长,不便维护。于是有了SPL autoload php的扩展。
class Tool { public static function auto($class) { $filename = $class.'.php'; require $filename; } } spl_autoload_register(array('Tool','auto')); spl_autoload_register(array('Kohana', 'auto_load'));
可以注册多个autoload ,上一个加载不到,会从下一个找。
spl_autoload_call本身的实现很简单,只是简单的按顺序执行这个链表中每个函数,在每个函数执行完成后都判断一次需要的类是否已经加载, 如果加载成功就直接返回,不再继续执行链表中的其它函数。如果这个链表中所有的函数都执行完成后类还没有加载,spl_autoload_call就直接 退出,并不向用户报告错误。因此,使用了autoload机制,并不能保证类就一定能正确的自动加载,关键还是要看你的自动加载函数如何实现。
spl_autoload_register函数可以将用户定义的自动加载函数注册到这个链表中,并将autoload_func函数指针指向spl_autoload_call函数。也可以通过spl_autoload_unregister函数将已经注册的函数从autoload_functions链表中删除