当前位置: 首页 > 后端技术 > PHP

PHP中类的自动加载

时间:2023-03-29 23:18:04 PHP

之前,我们学习了Composer的自动加载原理,其实就是利用了PHP中类自动加载的特性。文末有本系列文章的链接。PHP中类的自动加载主要依赖__autoload()和spl_autoload_register()这两个方法。今天我们就简单的看一下这两种方法的使用。__autoload()是一个即将被淘汰的神奇方法,我们只需要了解它就可以了。如果在PHP7中使用该方法,会报outdatedwarning,系统会建议我们使用spl_autoload_register()方法。函数__autoload($name){包括__DIR__。'/自动加载/'。$名字。'.class.php';}$autoA=newAutoA();var_dump($autoA);当我们实例化AutoA类时,当前的文件中没有这个类,也没有包含或require来自其他文件。这时候会自动进入魔术方法__autoload()。在__autoload()方法中,我们只需要包含这个类所在的文件即可。spl_autoload_register()方法替代了上述魔术方法自动加载类的功能。它是spl扩展库中的一个方法。现在PHP中默认集成了spl扩展库,大家可以放心直接使用。spl_autoload_register()相对于__autoload()的优势在于它可以注册一个__autoload(),并实现和维护一个__autoload()队列。过去一个文件中只能有一个__autoload()方法,但现在,你拥有的是一个队列。这样就不需要把所有的加载代码都写在一个__autoload()方法中,而是可以使用多个spl_autoload_register()分别加载每个类。spl_autoload_register(function($name){include__DIR__.'/autoload/'.$name.'.class.php';});$autoA=newAutoA();var_dump($autoA);参考:深入学习Composer原理(二)是否使用include或include_once在自动加载中,我们只需要使用include,类不会被重复加载。spl_autoload_register(function($name){include__DIR__.'/autoload/'.$name.'.class.php';echo$name,PHP_EOL;});$autoA=newAutoA();var_dump($autoA);$autoA=newAutoA();var_dump($autoA);$autoA=newAutoA();var_dump($autoA);$autoB=newAutoB();var_dump($autoB);从代码中我们可以看出$name在类被多次实例化时只输出一次。所以不用关心类文件重复加载的问题。而且在大型框架中使用composer时,会加载很多类,_once方法也会带来效率问题。综上所述,本文只是对类自动加载的简单介绍。如果想进一步了解这方面的知识,可以移步之前写的Composer系列文章:深入学习Composer原理(1)深入学习Composer原理(2)深入学习Composer原理(3))Composer原理深入学习(四)测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/201912/source/PHP%E4%B8%AD%E7%B1%BB%E7%9A%84%E8%87%AA%E5%8A%A8%E5%8A%A0%E8%BD%BD.php参考文档:https://www.php.net/manual/zh/language.oop5.autoload.php各媒体平台均可搜索【硬核项目经理】