php的自动加载

类的自动加载

概念:

当在php代码中的某一行,使用一个类的时候,但该类却还"不存在"的时候,就会去调用某个函数,在该函数中可以去加载"不存在"的类文件,以实现类的自动加载

一、常规自动加载函数:__autoload()

这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数。看下面例子:

Test.class.php代码如下:

<?php

class Test
{
    public function show()
    {
        echo 'hello world';
    }
}

?>

index.php代码如下:

<?php

function __autoload($class_name)
{
   $file_name = $class_name.'.class.php';

    if(is_file($file_name))
    {
        require_once($file_name);
    }
}

$object = new Test();
$object->show();

?>

运行index.php后正常输出hello world。在index.php中,由于没有包含Test.class.php,在实例化Test时,自动调用__autoload函数,参数$class_name的值即为类名Test,此时Test.class.php就被引进来了。  

在面向对象中这种方法经常使用,可以避免书写过多的引用文件,同时也使整个系统更加灵活。 

二、常规自动加载函数:spl_autoload_register()

接着看spl_autoload_register(),这个函数与__autoload有与曲同工之妙,看个简单的例子:

./class/Test.class.php

<?php

class Test
{
    public function show()
    {
        echo 'hello world';
    }
}

?>

./lib/B.class.php

<?php

class B
{
    public function show()
    {
        echo 'B';
    }
}

?>

index.php

<?php

//定义自定义加载函数
function load_include($class_name)
{
    $file_name = $class_name.'.class.php';

    include_once('./class/'.$file_name);

}

function load_include2($class_name)
{
    $file_name = $class_name.'.class.php';

    include_once('./lib/'.$file_name);
}


spl_autoload_register('load_include');  //注册自定义加载函数,负责加载class文件夹下的类
spl_autoload_register('load_include2'); // 负责加载lib文件夹下的类

$object = new Test();
$object->show();   //output: hello world

$b = new B();
$b->show()      //output: B

?>

将__autoload换成load_include()和load_include2()函数。但是这两个函数不会像__autoload自动触发,这时spl_autoload_register()就起作用了,它告诉PHP碰到没有定义的类就执行load_include和load_include2()。 

可以写多个spl_autoload_register()来自动加载不同文件夹下的类文件,使用这个函数灵活性很高,更灵活地控制自动加载的具体行为。而__autoload()只能存在一个,如果项目中使用的两个库都有 __autoload()就会出现冲突而无法运行,spl_autoload_register()则没有这个问题,多次使用spl_autoload_register(), 它会按顺序逐个调用加载器。如果已经使用了spl_autoload_register(), 那么__autoload()会被忽略,除非你手动重新注册它。


spl_autoload_register() 调用静态方法:

c.class.php

<?php

class c
{
   public static function show()
   {
       echo '类库c已经被成功加载';
   }
}

?>

load.php

<?php

class load
{
   public static function load_class($class_name)
   {
       $file_name = $class_name.'.class.php';

       return include_once($file_name);
   }
}


spl_autoload_register(array('load','load_class'));
//另一种写法:spl_autoload_register("load::load_class");

c::show()  //output: 类库c已经被成功加载

?>


声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复12人评论7,777人参与