在 PHP 中利用 spl_autoload() 函数实现自动加载

为什么需要自动加载?

在 PHP 编程的过程中,我们往往会将不同的类、功能、模块拆分成多个文件,从而简化程序结构、减少冗余代码。这些文件形成了互相依赖的关系。同时,如果我们使用第三方的类库等,也需要将文件引入。
在初学 PHP 时,一般使用的是 requireinclude 函数或命令。但是,当文件多起来的时候,将文件逐一引入就显得低效,也不利于代码的维护。这时,我们就需要一个自动加载机制,来管理、加载这些文件。

自动加载的实现方法

自动加载在 PHP 中的实现有多种方法。
是最简单的方法,就是将所有要加载的文件路径放入一个数组,遍历这个数组进行加载。但是这种加载方式将一些不一定用到的函数、类等也载入,造成了资源的浪费。这种方法是不可取的。改进的方法也很简单,PHP 内置了两个函数:__autoload()spl_autoload_register()
这种方法的示例如下:

1
2
3
4
5
class AutoloadExample{
function __autoloader($class_name){
require_once("{$class_name}.class.php");
}
}

对于__autoload() 函数,我们可以在类里定义 __autoload($class_name) 函数。该函数传入一个变量,就是要使用的类名。我们可以在函数体中根据传入的类名,计算出文件的路径,再使用 include 或者 require 函数将其载入。随后,可以写一个带有此函数的基类,再让程序的其他类继承这个基类。
spl_autoload_register() 函数则是 PHP SPL 库中的一部分。首先我们要自己定义一个自动加载函数,如 my_autoload(),定义方法同 __autoload() 函数。然后将这个函数的名称传递给 spl_autoload_register() 函数,来将这个函数注册为自动加载函数,即 spl_autoload_register('my_autoload')。这种方法的好处是在拥有多个项目或引用第三方类库时,可以防止各个自动加载函数的冲突。
这种方法的示例如下:

1
2
3
4
5
function autoload($class_name){
require_once("{$class_name}.class.php");
}

spl_autoload_register('autoload');

spl_autoload 系列的其他函数

需要指出,spl_autoload 只是 PHP SPL 库中的一部分,而 SPL 库提供了一系列有共性的问题的标准解决方法。在这里我们仅仅讨论自动加载相关的部分函数。

spl_autoload_call() 函数用于调用注册的自动加载函数,具体用法为 spl_autoload_call($class_name)
spl_autoload_unregister($function_name) 用于注销已注册的自动加载函数。
spl_autoload_functions() 返回一个包含所有已经注册函数的数组。

参考