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的更多相关文章

  1. SNMP报文抓取与分析(二)

    SNMP报文抓取与分析(二) SNMP报文抓取与分析(二) 1.SNMP报文表示简介 基本编码规则BER 标识域Tag表示 长度域length表示 2.SNMP报文详细分析(以一个get-respon ...

  2. Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题

    4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...

  3. yhd日志分析(二)

    yhd日志分析(二) 继续yhd日志分析,统计数据 日期 uv pv 登录人数 游客人数 平均访问时长 二跳率 独立ip数 1 分析 登录人数 count(distinct endUserId) 游客 ...

  4. SQLite入门与分析(二)---设计与概念(续)

    SQLite入门与分析(二)---设计与概念(续)   写在前面:本节讨论事务,事务是DBMS最核心的技术之一.在计算机科学史上,有三位科学家因在数据库领域的成就而获ACM图灵奖,而其中之一Jim G ...

  5. Linux内核启动代码分析二之开发板相关驱动程序加载分析

    Linux内核启动代码分析二之开发板相关驱动程序加载分析 1 从linux开始启动的函数start_kernel开始分析,该函数位于linux-2.6.22/init/main.c  start_ke ...

  6. 一些有用的javascript实例分析(二)

    原文:一些有用的javascript实例分析(二) 5 求出数组中所有数字的和 window.onload = function () { var oBtn = document.getElement ...

  7. Android4.0图库Gallery2代码分析(二) 数据管理和数据加载

    Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Androi ...

  8. MapReduce深度分析(二)

    MapReduce深度分析(二) 五.JobTracker分析 JobTracker是hadoop的重要的后台守护进程之一,主要的功能是管理任务调度.管理TaskTracker.监控作业执行.运行作业 ...

  9. Java线程池使用和分析(二) - execute()原理

    相关文章目录: Java线程池使用和分析(一) Java线程池使用和分析(二) - execute()原理 execute()是 java.util.concurrent.Executor接口中唯一的 ...

随机推荐

  1. 利用mvc模式,实现用户的注册

    实现功能:利用mvc模式,实现用户的登陆注册功能 1.程序的框架结构 2个包,bean,以及servlet 3个jsp页面,注册页面,注册成功页面,注册失败页面 mysql驱动 2.编程思想 通过js ...

  2. 笨办法学python3练习代码11-12:print()

    ex11.py print("How old are you? ",end = " ") #加入end = " ",则函数不再自动换行 ag ...

  3. 关于innerHtml= 与 html() 区别

    今天遇到的问题:如果写入的html 有<script>,必须用JQuery 的 html() 才能识别: 使用innerHtml 无法识别<script> 原因机制:待查询

  4. spring 命名空间

    命名空间太多了,有必要学习了解一下 xmlns是XML Namespaces的缩写 使用语法: xmlns:namespace-prefix="namespaceURI" xsi全 ...

  5. Docker技术入门与实战第2版-高清文字版

      Docker技术入门与实战第2版-高清文字版 下载地址https://pan.baidu.com/s/1bAoRQQlvBa-PXy5lgIlxUg 扫码下面二维码关注公众号回复100011 获取 ...

  6. Linux-sed命令使用笔记

    Linux的sed命令和python脚本一起,可以对文本进行快速的修改.比如在删除日志的时候,python写出固定日期删除脚本,再用sed循环将python脚本的日期修改调用,就可以批删除指定日期的日 ...

  7. 久等了,你要的 Python 书籍推荐,来了

    前言 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家提供 ...

  8. CSS品控与流程

    精通CSS意味着不仅能写出可用的标记和样式,还能让代码好阅读.方便移植.易维护. 1.外部代码质量:调试CSS 外部代理质量就是用户能体验到的最终结果.主要体现在几个方面. 正确性.CSS属性名都写对 ...

  9. Consul服务治理发现学习记录

    Consul 简介 Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用.限流.熔断和监控)解决方案,它是一个一个分布式的,高度可用的系统,而且开发使用都很简便.它提供了一个功 ...

  10. Android 开发学习进程0.17 Android资源文件selector textview显示两种不同字体

    selector 是安卓资源文件的一种,它可以使按钮等实现不同状态下的不同UI,不用在代码中实现,而使用方式有两种,一种在color文件下 创建.xml可以使按钮等字体在不同状态下的变化,其二是在dr ...