一、__autoload() (自 PHP 7.2.0 起被废弃,并自 PHP 8.0.0 起被移除)
__autoload 是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数。看下面例子:
<?php
class Test {
function say() {
echo 'hello world';
}
}
?>
<?php
function __autoload( $class ) {
$file = $class . '.class.php';
if ( is_file($file) ) {
require_once($file);
}
}
$obj = new Test();
$obj->say();
?>
运行后正常输出hello world?。
二、spl_autoload_register()
再看spl_autoload_register(),这个函数与__autoload有异曲同工之妙,看个简单的例子:
<?php
function loadSay( $class ) {
$file = $class . '.class.php';
if (is_file($file)) {
require_once($file);
}
}
spl_autoload_register( 'loadSay' );
$obj = new Test();
$obj->say();
?>
将__autoload换成自定义的loadSay函数。但是loadSay不会像__autoload自动触发,这时spl_autoload_register()就起作用了,它告诉PHP碰到没有定义的类就执行loadSay()。
三、spl_autoload_register() 调用静态方法
<?php
class test {
public static function loadSay( $class ) {
$file = $class . '.class.php';
if (is_file($file)) {
require_once($file);
}
}
}
spl_autoload_register( array('test','loadSay') );
//另一种写法:spl_autoload_register( "test::loadSay" );
$obj = new Test();
$obj->say();
?>
四、总结
spl_autoload_register和__autoload都是PHP自动加载的两种方式。自从spl_autoload_register出现后,已经逐渐替代了__autoload.虽然二者实现的最终功能一样,但是不同的是spl_autoload_register可以注册多种加载机制。而__autoload只可以定义一次。
比如,现在需要加载目录A和目录B内的类,A目录中定义所有文件名和类名一致,B目录下的文件名和类名也一样,但是会多一个和类名一样的目录,比如类MapA,存放在目录b/MapA/MapA.php,那么A和B注册加载机制不一样,如果用__autoload就需要多从判断,而spl_autoload_register分开写两种注册机制,都进行注册就好了。其实只是spl_autoload_register比__autoload更灵活而已。
|