PHP类的自动加载函数:spl_autload_register()

一个PHP项目里通常有许多个类(class),如果在每个PHP页面的开头进行引入,非常麻烦,尤其是不同的PHP页面需要不同的类。

因此,PHP7之前,有__autoload()函数用于自动引用类,PHP7之后则改为了spl_autload_register()函数。

自动加载的准备工作

我们在项目文件夹./public和./libs下分别存放了一些类,并且使用固定的名称格式“ClassName.class.php”,其中,位于./libs文件夹的Company.class.php内容如下

//位于.libs文件夹里的Company.class.php的内容
class Company{
    private $name;
    private $created;
    public function __construct($name1,$created1){
        $this->name = $name1;
        $this->created = $created1;
        echo "{$this->name}创建于{$this->created}年";
    }
}

使用有名函数进行自动加载

//项目文件内容
spl_autoload_register("func1");
spl_autoload_register("func2");
function func1($classname)
{
    $filename = "./public/$classname.class.php";
    if (file_exists($filename)) {
        require_once($filename);
    }
}
function func2($classname)
{
    $filename = "./libs/$classname.class.php";
    if (file_exists($filename)) {
        require_once($filename);
    }
}

$obj1 = new Company("山可唠", "2016");

输出:山可唠创建于2016年

逻辑不难理解:当我们创建了一个名为Company的对象时,PHP发现页面内并没有相关的类(class)定义,于是调用spl_autoload_register()函数进行查找,从func1查找到func2,如果项目文件夹内有对应名称的定义文件,则require进来,完成对象的创建,Company类里的构造函数根据我们传入的值,输出了“山可唠创建于2016年”。

使用匿名函数进行自动加载

有名函数很容易理解,但是代码比较繁琐,于是出现了更加精简的匿名函数方式。

spl_autoload_register(function($classname){
$arr = array(
"./libs/$classname.class.php",
"./class/$classname.class.php"
);
foreach ($arr as $filename){
if(file_exists($filename)){
require_once ($filename);
}
}
}
);
$obj1 = new Shinecloud("山可唠", "2016");

逻辑和有名函数是一样的,只是在写法上作了改动:建立一个$arr数组对象,将包含了类的地址存入其中,再使用foreach进行遍历,若文件存在,则引入。

如何选择使用

很明显地,如果项目体量大,类文件存在不同的文件夹内,且有不同的命名规则,使用匿名函数会更加简单、快速;如果只是个人项目,只使用单个文件夹存放固定格式的类,用有名函数就足矣。