类的自动加载
概念:
当在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已经被成功加载 ?>
声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。
精彩评论