php的自动加载方法有2种, 分别是__autoload和spl_autoload_register, 前者官方说不推荐使用, 未来可能废除, 所以这里就说说后者, 其实两者功能上差别不大….

spl_autoload_register 这个方法正如其名, 注册一个autoload的自动加载函数…

demo:

<?php
spl_autoload_register('load');
function load($className)
{
    echo $className,'<br>';
    include "{$className}.php";
}

$obj2 = new MyClass();
?>

例如上面这个例子这样, 当实例化一个未加载的class的时候(即class_exists(class_name)===false), 会自动运行spl_autoload_register注册的自动加载函数(也就是这里的load), 然后会类名当初参数传递过去…

比较牛B的是, 这个函数连继承的父类class 或者 接口都能捕捉到….

<?php
spl_autoload_register('load');
function load($className)
{
    echo $className,'<br>';
    include "{$className}.php";
}

$obj2 = new MyClass();


//------------


//MyClass.php
class MyClass extends MyClass2
{

    function __construct()
    {
        parent::__construct();
        echo ' I am class1';
    }
}


//-------------


//MyClass2.php
class MyClass2 implements MyClass3
{

    function __construct()
    {
        echo ' I am class2';
    }
}
?>

以上代码运行结果是: MyClass MyClass2 MyClass3

不仅如此, 如果使用命名空间, 也可以正确识别…一些PHP框架的自动加载机制也是基于这个自动加载方法来实现的, 所以一般都会在类命名上下功夫, 例如 APP_Model_User 这样来定位该类的所在目录…