PHP的自动加载autoload和spl_autoload_register

一、自动加载的实现

1、___autoload()

PHP早期支持的版本。如果你需要实现自动加载,可以通过定义这个函数来启用。如下:

function __autoload($class){
   $className = strtolower($class);
   $path = './includes/'.$className.".php";
    if(file_exists($path)){
         require_once($path);
    }else{
        die("the file {$className} could not be found");      
    }
}

这样就会自动加载当前目录的 includes 下的文件了。

类似用法经常在私人项目,或者说是单一项目的框架中见到,为什么呢?因为你只能定义一个__autoload 函数,在多人开发中做不到不同的开发者使用不同的自定义的autoloader,除非大家都提前说好了,都使用一个__autoload,涉及到改动了就进行版本同步,这很麻烦。

2.spl_autoload_register()
于是,为了解决上面的问题,在PHP的5.3版本,引入了spl_autoload_register
不再是让你只能定义一个函数了。是官方定义的好的函数,你只需要调用它,把你的加载逻辑写在它的匿名函数即可。

使用方法如下:


spl_autoload_register(function($className){
    $name = strtolower($className);
    $path= "./includes/{$name}.php";

    if(file_exists($path)){
        require_once($path);
    }else{
        die("the file {$className} could not be found");
    }
});

2、spl_autoload_register() 调用静态方法

class test {
 public static function loadprint( $class ) {
  $file = $class . '.class.php';  
  if (is_file($file)) {  
   require_once($file);  
  } 
 }
} 
 
spl_autoload_register(  array('test','loadprint')  );
//另一种写法:spl_autoload_register(  "test::loadprint"  );

二、自动加载的优点

自动加载不同于requireinclude。autoload机制是lazy loading。即是并不是你一运行就给你调用所有的文件,而是只有你用到了哪个,比如说new了哪个文件以后,才会通过autoload机制去加载相应文件。
为了提高程序的性能,很多大型的框架都是使用这种加载方式。比如laravel中就大量使用这个方式。

三、__autoload和spl_autoload_register的区别

__autoload只能定义一个,当多个框架或者多人开发时,容易造成报 __autoload 重复定义的出错。spl_autoload_register不一定,可以写多个,没有限制

作者:houxin
链接:https://www.jianshu.com/p/02ccdd39e90a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
原文地址:https://www.cnblogs.com/zhangzhijian/p/14575728.html