PHP的自动加载类的机制以及实现

来源:互联网 发布:红叶知弦 本子 编辑:程序博客网 时间:2024/06/08 06:33

最近偶然看到了php的自动加载类,小小研究一番,在此写下我的心得。

我们在进行小规模的开发时,常常会用require或者include引用系统的公共文件(.php,.inc,.class.php),或者你尝试使用一个未知类时,会产生致命错误,这时你也可以用上述方法。但是在大型的开发中,这么做会产生大量的require或者include方法调用,这样做会降低效率,代码的可维护性也会大大降低,况且require_once的代价很大。

所以php的自动加载函数__autoload()和spl_autoload_register()就派上了用场。

首先是__autoload()函数:

假设当前目录下每个文件对应一个类. 当脚本尝试来产生一个类User的实例,PHP会执行__autoload. 假设class_User.php中定义有User类.. 不管调用时是大写还是小写,PHP将返回名称的小写。

但是问题又来了,从__autoload中抛出的异常不能被catch语句块捕获并导致致命错误,而且当一个大型项目开发中引入多个类库时,可能因为各个类库之间不同的__autoload机制而导致一些难以理解的错误,因此我们多了一种选择,那就是spl_autoload_register()函数(php5引入SPL标准库以后)。

此函数的功能就是把函数注册至SPL的__autoload函数栈中,并移除系统默认的__autoload()函数。

语法:bool  spl_autoload_register ( [callback $autoload_function] )    接受两个参数:一个是添加到自动加载栈的函数,另外一个是加载器不能找到这个类时是否抛出异常的标志。第一个参数是可选的,并且默认指向spl_autoload()函数,这个函数会自动在路径中查找具有小写类名和.php扩展或者.ini扩展名,或者任何注册到spl_autoload_extensions()函数中的其它扩展名的文件。

也可以使用类的方法来实现自定义的加载函数

 

一旦调用spl_autoload_register()函数,当调用未定义类时,系统会按顺序调用注册到spl_autoload_register()函数的所有函数,而不是自动调用__autoload()函数。如果要避免这种情况,需采用一种更加安全的spl_autoload_register()函数的初始化调用方法:

 

spl_autoload_functions()函数会返回已注册函数的一个数组,如果SPL自动加载栈还没有被初始化,它会返回布尔值false。然后,检查是否有一个名为__autoload()的函数存在,如果存在,可以将它注册为自动加载栈中的第一个函数,从而保留它的功能。之后,可以继续注册自动加载函数。

还可以调用spl_autoload_register()函数以注册一个回调函数,而不是为函数提供一个字符串名称。如提供一个如array('class','method')这样的数组,使得可以使用某个对象的方法。

下一步,通过调用spl_autoload_call('className')函数,可以手动调用加载器,而不用尝试去使用那个类。这个函数可以和函数class_exists('className',false)组合在一起使用以尝试去加载一个类,并且在所有的自动加载器都不能找到那个类的情况下失败。

SPL自动加载功能是由spl_autoload() ,spl_autoload_register(), spl_autoload_functions() ,spl_autoload_extensions()和spl_autoload_call()函数提供的。

 

 

一般情况下,推荐使用spl_autoload_register()来处理;

还可以通过spl_autoload_functions()查看你当前注册了多少autoload函数。

另外在linux和unix环境下,还有很多技巧,有待学习。

 


 

原创粉丝点击