PHP实现自动加载,有两种方法:
①魔术函数 __autoload()
②spl扩展 spl_autoload_register
分别举例说明:
一、__autoload
printit.class.php:
index.php:
当我们每次运行index.php后都会正常输出hello world,尽管我们并没有在index.php中引入printit.class.php文件,但是我们依然能够用PRINTIT类内的方法。
在index.php中,由于没有包含printit.class.php,在实例化printit时,自动调用__autoload函数,参数$class的值即为类名printit,此时printit.class.php就被引进来了。
在面向对象中这种方法经常使用,可以避免书写过多的引用文件,同时也使整个系统更加灵活。
二、spl_autoload_register()
将__autoload换成loadprint函数。
但是loadprint不会像__autoload自动触发,这时spl_autoload_register()就起作用了,它告诉PHP碰到没有定义的类就执行loadprint()。
spl_autoload_register() 调用静态方法。
注:SPL是Standard PHP Library(标准PHP库)的缩写。
它是PHP5引入的一个扩展库,其主要功能包括autoload机制的实现及包括各种Iterator接口或类。
SPL autoload机制的实现是通过将函数指针autoload_func指向自己实现的具有自动装载功能的函数来实现的。
SPL有两个不同的函数spl_autoload, spl_autoload_call,通过将autoload_func指向这两个不同的函数地址来实现不同的自动加载机制。
如果同时用spl_autoload_register注册了一个类的方法和__autoload函数,那么,会根据注册的先后,如果在第一个注册的方法或函数里加载了类文件,就不会再执行第二个被注册的类的方法或函数。
反之就会执行第二个被注册的类的方法或函数。