转载地址:https://www.cnblogs.com/wangmy/p/6692970.html

第一部分是引入自动加载配置文件

1.入口文件:autoload.php
里面没什么东西,就是导入ComposerAutoloader主题文件,一般由一个复杂的名字,不过不用担心就是机器随机生成的一个码而已,就是普通的一个类,名字比较长了。

require_once __DIR__ . '/composer/autoload_real.php';return ComposerAutoloaderInitd0a5721608b46fc86f3b980fb0cea37d::getLoader();

2.自动加载主题文件:ComposerAutoloaderInitd0a5721608b46fc86f3b980fb0cea37d
getLoader(){.....}
这个就是获得自动加载的主方法,这个有点像代加工厂、里面其实只是组装了下,实际的部件在别的类(后面会提到的ClassLoader类),接下来说说getLoader方法做了哪些代加工

  • 把实际干活的小工招进厂->
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
  • 判断了下PHP版本 如果版本大于5.6 就使用闭包绑定的方式去进行绑定自动加载的配置、需要注意的是,这些内容其实都是composer dump-autoload命令生成的 所以修改了composer.json后一定要执行下该命令。下面的代码段就是给各种psr规则都设置进私有变量,闭包居然还可以这么直接搞好犀利的赶脚
return \Closure::bind(function () use ($loader) {$loader->prefixLengthsPsr4 = ComposerStaticInitd0a5721608b46fc86f3b980fb0cea37d::$prefixLengthsPsr4;$loader->prefixDirsPsr4 = ComposerStaticInitd0a5721608b46fc86f3b980fb0cea37d::$prefixDirsPsr4;$loader->prefixesPsr0 = ComposerStaticInitd0a5721608b46fc86f3b980fb0cea37d::$prefixesPsr0;
}, null, ClassLoader::class);
  • 如果版本小于5.6就使用原始点的方法,通过setxxx来一个个进行设置自动加载的配置,和上面实现的功能其实一样的,但是代码量就大很多了
$map = require __DIR__ . '/autoload_namespaces.php';
foreach ($map as $namespace => $path) {$loader->set($namespace, $path);
}$map = require __DIR__ . '/autoload_psr4.php';
foreach ($map as $namespace => $path) {$loader->setPsr4($namespace, $path);
}$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) {$loader->addClassMap($classMap);
}
  1. 最后把loader类注册一下
spl_autoload_register(array($this, 'loadClass'), true, $prepend);

第二部分是如何通过类名找到该文件并引入

  1. 入口方法:ClassLoader.php中的loadClass(),寻找顺序是 先classMap里找 再PSR4 PSR0 找
// class map lookup
if (isset($this->classMap[$class])) {return $this->classMap[$class];
}
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {return false;
}
if (null !== $this->apcuPrefix) {$file = apcu_fetch($this->apcuPrefix.$class, $hit);if ($hit) {return $file;}
}$file = $this->findFileWithExtension($class, '.php');// Search for Hack files if we are running on HHVM
if (false === $file && defined('HHVM_VERSION')) {$file = $this->findFileWithExtension($class, '.hh');
}if (null !== $this->apcuPrefix) {apcu_add($this->apcuPrefix.$class, $file);
}if (false === $file) {// Remember that this class does not exist.$this->missingClasses[$class] = true;
}return $file;

PHP PSR4自动加载代码赏析相关推荐

  1. thinkphp源码分析(三)—自动加载篇(Loader的分析)

    源码分析 自动加载 系统会调用 Loader::register()方法注册自动加载,在这一步完成后,所有符合规范的类库(包括Composer依赖加载的第三方类库)都将自动加载. 系统的自动加载由下面 ...

  2. TP5.1类的自动加载

    TP5类的自动加载 学会了作用就是:可以在框架中任意地方创建类,并调用 类的自动加载代码原理这里就说不清了,我兴趣的可以看看慕课网singwa老师的课: https://coding.imooc.co ...

  3. thinkphp 框架自动加载原理_thinkPHP5.0框架自动加载机制分析

    本文实例讲述了thinkPHP5.0框架自动加载机制.分享给大家供大家参考,具体如下: 概述 ThinkPHP5.0 真正实现了按需加载,所有类库采用自动加载机制,并且支持类库映射和composer类 ...

  4. PHP自动加载下——PSR4

    1.先来介绍一下PSR规范 PHP-FIG,它的网站是:www.php-fig.org.就是这个联盟组织发明和创造了PSR规范,其中自动加载涉及其中两个规范,一个是PSR0,一个是PSR4, PSR0 ...

  5. php+psr4和自动加载,php自动加载规范 PSR4 (Thinkphp)

    PSR4是一种自动加载规范,老版本是PSR0,尽管thinkPHP支持PSR4和PSR0的自动加载方式,但是默认也是优先进行PSR4加载,如果失败,再进行PSR0的加载.本篇文章只会讨论PSR4的加载 ...

  6. PHP PSR-4 Autoloader 自动加载(中文版)

    引用:https://segmentfault.com/a/1190000002521658 Autoloader 关键词 "必须"("MUST")." ...

  7. php psr 编码规范_PHP之PSR-4规范:自动加载

    1. 概述 本 PSR 是关于由文件路径 自动载入 对应类的相关规范, 本规范是可互操作的,可以作为任一自动载入规范的补充,其中包括 PSR-0,此外, 本 PSR 还包括自动载入的类对应的文件存放路 ...

  8. 宝塔 php redis not found in_PHP之PSR-4规范:自动加载

    1. 概述 本 PSR 是关于由文件路径 自动载入 对应类的相关规范, 本规范是可互操作的,可以作为任一自动载入规范的补充,其中包括 PSR-0,此外, 本 PSR 还包括自动载入的类对应的文件存放路 ...

  9. http://184.154.128.246/index.php,小程序实现自动加载的完整代码

    本篇文章给大家带来的内容是关于小程序实现自动加载的完整代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 售中({{count}}) 已售({{counts}}) {{item.go ...

最新文章

  1. 到底是什么特征影响着CNN的性能?
  2. iptables相关管理命令
  3. Mysql 数据库锁表的原因和解决方法
  4. js 获取时间戳的方法
  5. 完整的WebApplication JSF EJB JPA JAAS –第1部分
  6. Flutter 中的国际化之多语言环境
  7. linux bash readline,Bash readline 使用技巧
  8. wifi不断重连报错:eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON解决
  9. mc 服务器设置自动重启,《我的世界》服务器重启方法介绍 如何重启服务器
  10. Altuim Designer 21学习笔记
  11. SRE(运维工程师)一文详解技术体系和架构师成长之路
  12. HTML5表白小程序
  13. 全网最全AD16——原理图绘制
  14. 将大写字母转化为小写字母
  15. 仿牛客项目(持续更新)
  16. android备忘录备份,安卓手机备忘录怎么转到新手机?
  17. 数字信号处理实验(二)
  18. Python中numpy库中 axis=0,axis= 1轴的详解
  19. 《初级会计电算化应用教程(金蝶KIS专业版)》——1.2 会计电算化发展概况
  20. 杂谈SuperMap支持的三维数据

热门文章

  1. SpringBoot使用ResponseBodyAdvice进行统一响应处理
  2. 【SpringCloud从0到6】 第二节:注册中心 - eureka
  3. vb红绿灯自动切换_VB红绿灯程序.doc
  4. 调节pycharm字体大_字体美化大师里的字体推荐
  5. JDK 9 中有哪些 jmod 文件?
  6. 北京开源人linux运维实战
  7. Tengine(Nginx)动静分离简要配置
  8. FastReport的动态页面设置
  9. 用户行为分析笔记(二):系统的整体架构
  10. java读取request中的xml