面向对象 - 自动加载

  • 作者:KK

  • 发表日期:2017.3.28


autoload何时被运行

autoload可以用来自动加载没加载过的类

spl_autoload_register(function($className){
	echo '引发了' . $className . '的加载';
});

$test = new Test(); // 引发了Test的加载   然后报错

将一个函数作为参数传给spl_autoload_register即可注册你的autoload,然后new一个不存在的类的时候,会自动触发这个函数的运行

系统自动运行autoload的时候这个函数会收到一个参数(就是上面的“$className”),这个参数的值就是被new的那个不存在的类名


加载不存在的类

autoload在被触发的时候通常要做的一件事,也是它的最终目的:实现加载这个不存在的类

spl_autoload_register(function($className){
	include('E:\demo\' . $className . '.php'); //引入这个类对应的文件
	
	return new $className(); //返回实例
});

$test = new Test(); // 引发了Test的加载   然后报错

当然此时要在demo目录下放好一个Test.php,里面定义Test类啦

  • 如果不用autoload

    一旦加载很多个类,就会变成这样的代码:

    include('E:\demo\A.php');
    $a = new A();
    	
    include('E:\demo\B.php');
    $b = new B();
    	
    include('E:\demo\C.php');
    $c = new C();
    	
    include('E:\demo\D.php');
    $d = new D();
    	
    include('E:\demo\E.php');
    $e = new E();
    

    你看这多少include语句,每new一个类都要先include它是不是很累?实际上一个项目经常要加载的类有30~50个左右,那就要写50次include了喔

    所以用autoload就能省事了,现在已经没有熟手会傻傻地一个个include了


关于__autoload

$test = new Test(); // Test 来了来了

function __autoload($className){
	echo '引发了' . $className . '的加载';
}

只要定义一个名叫__autoload函数,当系统发现Test类不存在的时候也会自动触发这个函数,但这个做法是旧版本PHP的自动加载机制

目前还能兼容,可以后就应该不会兼容了,所以不建议使用这个