__autoload及spl_autoload_register

2017-05-14  本文已影响110人  一只好奇的茂

之前在项目中,都是使用include_once来导入其他class,导致项目中每一个文件都include_once了很多其他文件,最近发现使用spl_autoload_register后,每个文件只需要多定义并调用一个方法即可,具体使用方法如下:

简介

一般情况下,都用spl_autoload_register来取代_ _autoload()了,因为spl_autoload_register 可以很好地处理需要多个加载器的情况,这种情况下 spl_autoload_register 会按顺序依次调用之前注册过的加载器。作为对比, __autoload 因为是一个函数,所以只能被定义一次。

用法

__autoload()

我把很多个类文件以 类名.class.php的形式存放在class目录中,在class的同级目录中建立一个index.php。进入class目录里面分别建立class1.class.php、class2.class.php、class3.class.php文件,分别为里面的文件添加一下代码

<?php
//class1.class.php中
class class1{
    public function __construct(){
        echo "class1";
    }
}
?>

<?php
//class2.class.php中
class class2{
    public function __construct(){
        echo "class2";
    }
}
?>

<?php
//class3.class.php中
class class3{
    public function __construct(){
        echo "class3";
    }
}
?>

index.php文件中写入

<?php
function __autoload($classname){
    $filename = "./class/".$classname.".class.php";
    if(is_file($filename)){
        include $filename;
    }
}

$test1 = new class1();
echo '<br/>';
$test1 = new class2();
echo '<br/>';
$test1 = new class3();

/*
结果是
class1
class2
class3
*/
?>

我们成功的自动加载了class下面所有的要加载的类。

spl_autoload_register()

class里面的文件不做任何改变,只是简单的改写一下index.php

<?php
// 写一个loadclass函数
// loadclass函数不具备自动加载类的功能
function loadclass($classname){
    $filename = "./class/".$classname.".class.php";
    if(is_file($filename)){
        include $filename;
    }
}
// spl_autoload_register()函数让这个loadclass具备了自动加载类的功能
spl_autoload_register("loadclass");

$test1 = new class1();
echo '<br/>';
$test1 = new class2();
echo '<br/>';
$test1 = new class3();
?>

后记

因为在每个文件中都定义或调用spl_autoload_register()或autoload()还是显得太麻烦,在后面的开发中,我发现了一个更简单的办法---使用composer来构建项目,这样只需要在每个文件中,加入

require_once __DIR__.'/vendor/autoload.php';

即可。
具体做法可参考官方文档:composer基本用法

上一篇下一篇

猜你喜欢

热点阅读