composer分析(二)结合PSR-4
composer分析(二)结合PSR-4
PSR-4提供了一种文件和路径映射关系,非常类似文件系统的组织结构
全限定类名
\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
规定了类必须有一个顶级命名空间,可以有多个子命名空间。
顶级命名空间和目录对应的关系相对特殊,可在autoload_psr4.php中查看
映射关系是一个数组,是因为composer支持从多个目录下加载同一个命名空间前缀
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
'Opis\\Closure\\' => array($vendorDir . '/opis/closure/src'),
'FastRoute\\' => array($vendorDir . '/nikic/fast-route/src'),
...
'App\\' => array($baseDir . '/App'),
); 子命名空间分别对应顶级路径下的文件夹,如 App\Logic\HttpController\TestController对应路径是"{$baseDir} /App/Logic/HttpController"下的TestController.php 同时PSR-4要求文件名必须和类名保持完全一致,上述的TestController.php文件名由TesctController这个类名决定。
映射规则
vendor/
vendor_name/
package_name/
src/
ClassName.php # Vendor_Name\Package_Name\ClassName
tests/
ClassNameTest.php # Vendor_Name\Package_Name\ClassNameTest
composer文件夹下的文件
autoload_classmap.php // 保存类文件和真实路径映射
autoload_files.php // 保存全局函数文件和路径映射
autoload_psr4.php // 保存顶级命名空间和路径映射
autoload_static.php // 保存composer加载器解析过程中需要用到的映射关系数组
ClassLoader.php
此文件中的findFile方法会先查找classmap中是否存在需要加载类的映射,如果不存在会先根据上文描述的PSR-4规则拼接文件的真实路径,没找到还会走PSR-0规则。最后然会文件的绝对路径include完成文件的加载。可以看到如果存在类路径映射会非常快的实现类的自动加载,就不需要文件系统的检查了。
如何生成类映射关系: 执行命令 composer dump-autoload (-o),生产环境建议执行,因为从classmap中直接返回映射关系,便不需要再去动态读取PSR加载规范了,可减少文件系统的操作,提升部分性能
有兴趣的可以打印composer返回的自动加载器对象,允许我们在引入autoload.php文件后动态添加各种的映射关系
下集预告:composer的基本命令
composer分析(二)结合PSR-4的更多相关文章
- SNMP报文抓取与分析(二)
SNMP报文抓取与分析(二) SNMP报文抓取与分析(二) 1.SNMP报文表示简介 基本编码规则BER 标识域Tag表示 长度域length表示 2.SNMP报文详细分析(以一个get-respon ...
- Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题
4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...
- yhd日志分析(二)
yhd日志分析(二) 继续yhd日志分析,统计数据 日期 uv pv 登录人数 游客人数 平均访问时长 二跳率 独立ip数 1 分析 登录人数 count(distinct endUserId) 游客 ...
- SQLite入门与分析(二)---设计与概念(续)
SQLite入门与分析(二)---设计与概念(续) 写在前面:本节讨论事务,事务是DBMS最核心的技术之一.在计算机科学史上,有三位科学家因在数据库领域的成就而获ACM图灵奖,而其中之一Jim G ...
- Linux内核启动代码分析二之开发板相关驱动程序加载分析
Linux内核启动代码分析二之开发板相关驱动程序加载分析 1 从linux开始启动的函数start_kernel开始分析,该函数位于linux-2.6.22/init/main.c start_ke ...
- 一些有用的javascript实例分析(二)
原文:一些有用的javascript实例分析(二) 5 求出数组中所有数字的和 window.onload = function () { var oBtn = document.getElement ...
- Android4.0图库Gallery2代码分析(二) 数据管理和数据加载
Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Androi ...
- MapReduce深度分析(二)
MapReduce深度分析(二) 五.JobTracker分析 JobTracker是hadoop的重要的后台守护进程之一,主要的功能是管理任务调度.管理TaskTracker.监控作业执行.运行作业 ...
- Java线程池使用和分析(二) - execute()原理
相关文章目录: Java线程池使用和分析(一) Java线程池使用和分析(二) - execute()原理 execute()是 java.util.concurrent.Executor接口中唯一的 ...
随机推荐
- Elasticsearch权威指南(中文版)
Elasticsearch权威指南(中文版) 下载地址: https://pan.baidu.com/s/1bUGJmwS2Gp0B32xUyXxCIw 扫码下面二维码关注公众号回复100010 获取 ...
- Django REST framework 单元测试
Django REST framework 单元测试 只是简单记录一下测试代码怎么写 环境 Win10 Python3.7 Django2.2 项目 参照官网 快速开始 写了一个 demo 测试 参照 ...
- Consul服务治理发现学习记录
Consul 简介 Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用.限流.熔断和监控)解决方案,它是一个一个分布式的,高度可用的系统,而且开发使用都很简便.它提供了一个功 ...
- C#LeetCode刷题之#225-用队列实现栈(Implement Stack using Queues)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4106 访问. 使用队列实现栈的下列操作: push(x) -- ...
- golang实现 快速排序算法
快速排序算法原理: b站https://b23.tv/uJqRYN package main import "fmt" //[]int{1,2,3,4,5,6,7,8} func ...
- 攻防世界-web(进阶)-NaNNaNNaNNaN-Batman
用winhex打开,发现是一个javascript代码.将文件重命名为html文件,用浏览器打开. 打开是一个输入框,输入任何东西都梅反应,尝试弹框输入也无果,继续查看代码. 查看代码,可以看到最开始 ...
- 机器学习:支持向量机(SVM)
SVM,称为支持向量机,曾经一度是应用最广泛的模型,它有很好的数学基础和理论基础,但是它的数学基础却比以前讲过的那些学习模型复杂很多,我一直认为它是最难推导,比神经网络的BP算法还要难懂,要想完全懂这 ...
- Java多线程_缓存对齐
1.什么是缓存对齐 当前的电脑中,数据存储在磁盘上,可以断电保存,但是读取效率较低.不断电的情况下,数据可以在内存中存储,相对硬盘效率差不多是磁盘的一万倍左右.但是运算时,速度最快的是直接缓存在CPU ...
- idea配置opencv
参考:https://blog.csdn.net/sinat_38102206/article/details/81156589 配置运行时参数.通过菜单“Run->Edit Configura ...
- Dbeaver连接Hive和Mysql的配置
1.连接Hive 首选需要配置Hive 这里我们采用的是JDBC的连接方式 (1) 在Hive中后台启动hiveserver2 [root@hadoop-101 hive]# bin/hiveserv ...