PHP PSR4自动加载代码赏析
转载地址: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);
}
- 最后把loader类注册一下
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
第二部分是如何通过类名找到该文件并引入
- 入口方法: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自动加载代码赏析相关推荐
- thinkphp源码分析(三)—自动加载篇(Loader的分析)
源码分析 自动加载 系统会调用 Loader::register()方法注册自动加载,在这一步完成后,所有符合规范的类库(包括Composer依赖加载的第三方类库)都将自动加载. 系统的自动加载由下面 ...
- TP5.1类的自动加载
TP5类的自动加载 学会了作用就是:可以在框架中任意地方创建类,并调用 类的自动加载代码原理这里就说不清了,我兴趣的可以看看慕课网singwa老师的课: https://coding.imooc.co ...
- thinkphp 框架自动加载原理_thinkPHP5.0框架自动加载机制分析
本文实例讲述了thinkPHP5.0框架自动加载机制.分享给大家供大家参考,具体如下: 概述 ThinkPHP5.0 真正实现了按需加载,所有类库采用自动加载机制,并且支持类库映射和composer类 ...
- PHP自动加载下——PSR4
1.先来介绍一下PSR规范 PHP-FIG,它的网站是:www.php-fig.org.就是这个联盟组织发明和创造了PSR规范,其中自动加载涉及其中两个规范,一个是PSR0,一个是PSR4, PSR0 ...
- php+psr4和自动加载,php自动加载规范 PSR4 (Thinkphp)
PSR4是一种自动加载规范,老版本是PSR0,尽管thinkPHP支持PSR4和PSR0的自动加载方式,但是默认也是优先进行PSR4加载,如果失败,再进行PSR0的加载.本篇文章只会讨论PSR4的加载 ...
- PHP PSR-4 Autoloader 自动加载(中文版)
引用:https://segmentfault.com/a/1190000002521658 Autoloader 关键词 "必须"("MUST")." ...
- php psr 编码规范_PHP之PSR-4规范:自动加载
1. 概述 本 PSR 是关于由文件路径 自动载入 对应类的相关规范, 本规范是可互操作的,可以作为任一自动载入规范的补充,其中包括 PSR-0,此外, 本 PSR 还包括自动载入的类对应的文件存放路 ...
- 宝塔 php redis not found in_PHP之PSR-4规范:自动加载
1. 概述 本 PSR 是关于由文件路径 自动载入 对应类的相关规范, 本规范是可互操作的,可以作为任一自动载入规范的补充,其中包括 PSR-0,此外, 本 PSR 还包括自动载入的类对应的文件存放路 ...
- http://184.154.128.246/index.php,小程序实现自动加载的完整代码
本篇文章给大家带来的内容是关于小程序实现自动加载的完整代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 售中({{count}}) 已售({{counts}}) {{item.go ...
最新文章
- 到底是什么特征影响着CNN的性能?
- iptables相关管理命令
- Mysql 数据库锁表的原因和解决方法
- js 获取时间戳的方法
- 完整的WebApplication JSF EJB JPA JAAS –第1部分
- Flutter 中的国际化之多语言环境
- linux bash readline,Bash readline 使用技巧
- wifi不断重连报错:eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON解决
- mc 服务器设置自动重启,《我的世界》服务器重启方法介绍 如何重启服务器
- Altuim Designer 21学习笔记
- SRE(运维工程师)一文详解技术体系和架构师成长之路
- HTML5表白小程序
- 全网最全AD16——原理图绘制
- 将大写字母转化为小写字母
- 仿牛客项目(持续更新)
- android备忘录备份,安卓手机备忘录怎么转到新手机?
- 数字信号处理实验(二)
- Python中numpy库中 axis=0,axis= 1轴的详解
- 《初级会计电算化应用教程(金蝶KIS专业版)》——1.2 会计电算化发展概况
- 杂谈SuperMap支持的三维数据