PHP自动加载原理

当PHP new一个未定义的类时,如果该类文件没有引入或定义,则会报错:

Fatal error: Uncaught Error: Class 'xxx' not found in...

自PHP5.1起,可以通过spl_autoload_register函数实现类的自动加载,该函数第一个参数就是未定义类的类名。当new一个未定义的类时,如果该类文件没有引入或定义,如果文件中声明了spl_autoload_register函数,则会把类名作为参数传入该函数。用户就可以根据传入的参数,require或include指定的类文件,实现自动加载。

下面举一个简单的例子,例如有一个类文件class1.php,代码如下:

<?php
class Class1
{
    public function __construct()
    {
        echo "class1 is build\n";
    }
}

然后在class1.php的同级目录下,新建一个index.php,代码如下:

<?php
$c = new Class1();

然后运行index.php,结果如下:

可以看到,如果没有require class1.php,直接new class1的话会报错。下面修改index.php代码:

<?php
function myLoader($className)
{
    echo "class:{$className} is not find\r\n";
    require $className.'.php';
}
spl_autoload_register('myLoader');
$c = new Class1();

然后运行index.php,结果如下:

现在程序可以正常运行了。

同时,也可以创建一个自动加载的类来处理。
修改index.php代码如下:

<?php
class MyAutoLoader
{
    public static function getLoader($className)
    {
        echo "class:{$className} is not find\r\n";
        require $className.'.php';
    }
}
//第一种写法
//spl_autoload_register('MyAutoLoader::getLoader');
//第二种写法
$loader = new MyAutoLoader();
spl_autoload_register(array($loader,'getLoader'));
$c = new Class1();

发表评论

电子邮件地址不会被公开。 必填项已用*标注