• 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'),
      );
      
      子命名空间分别对应顶级路径下的文件夹,如 AppLogicHttpControllerTestController对应路径是"{$baseDir} /App/Logic/HttpController"下的TestController.php
          
      同时PSR-4要求文件名必须和类名保持完全一致,上述的TestController.php文件名由TesctController这个类名决定。
      
    • 映射规则

      vendor/
          vendor_name/
              package_name/
                  src/
                      ClassName.php       # Vendor_NamePackage_NameClassName
                  tests/
                      ClassNameTest.php   # Vendor_NamePackage_NameClassNameTest
      
    • 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的基本命令

  • 相关阅读:
    2016.11.21随笔
    2016.11.19随笔
    年月日
    导航position:absolute
    360搜索(边框)
    导航代码position:relative
    邮箱注册代码
    2016.11.18随笔
    2016.11.17随笔
    个人简历网页版代码
  • 原文地址:https://www.cnblogs.com/alwayslinger/p/13354041.html
Copyright © 2020-2023  润新知