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" );
二、自动加载的优点
自动加载不同于require
和include
。autoload机制是lazy loading。即是并不是你一运行就给你调用所有的文件,而是只有你用到了哪个,比如说new了哪个文件以后,才会通过autoload机制去加载相应文件。
为了提高程序的性能,很多大型的框架都是使用这种加载方式。比如laravel中就大量使用这个方式。
三、__autoload和spl_autoload_register的区别
__autoload只能定义一个,当多个框架或者多人开发时,容易造成报 __autoload 重复定义的出错。spl_autoload_register不一定,可以写多个,没有限制
作者:houxin
链接:https://www.jianshu.com/p/02ccdd39e90a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。