composer中的自动加载(classmap、files、PSR-0、OSR-4)

composer除了管理依赖包的功能之外,自动加载也是composer的很重要的一个功能, 我们在使用依赖包的时候,并不需要每一个文件都去加载,而是引入composer的入口文件即可调用所有依赖类。 这就是composer已经为我们实现了自动加载的功能。 我们打开一个使用了composer的目录:

12121.png

在composer的核心中,存在着几个以autoload开头的文件,都是用来提供自动加载的功能的。

  • autoload_classmap.php 存放类与文件路径的映射

  • autoload_namespaces.php 存放命名空间与目录路径的映射

  • autoload_psr4.php 存放符合psr4规范的映射关系

还有其他几个是加载的逻辑的处理等等,这里就先不详细讲,主要处理是从上面几个映射关系中寻找类文件并加载。


当我们更新依赖包,新增依赖包,删除依赖包的时候。composer都会更新它维护的那几个映射文件。


composer也提供了我们自己定义映射的功能,我们可以在composer.json文件中进行设置配置项。

当前提供PSR-0, PSR-4, classmap,files 四种加载方式的配置

** files **    如果你想要明确的指定,在每次请求时都要载入某些文件,那么你可以使用’files’ autoloading。通常作为函数库的载入方式(而非类库)

{
    "autoload": {
        "files": ["src/common/functions.php"]
    }
}


** classmap **    当我们在使用一些不符合psr规范的类库时,比如老版的phpqrcode,它并没有使用命名空间。 这个时候我们将这类型的类文件放在一个目录中,并使用classmap方法设置在加载类文件的时候搜索这些目录。

{
    "autoload": {
        "classmap": ["src/", "lib/"]
    }
}


** psr4映射设置 **    PSR-4和PSR-0最大的区别是对下划线的定义不同。PSR-4中,在类名中使用下划线没有任何特殊含义。而PSR-0则规定类名中的下划线会被转化成目录分隔符。 现在一般都是使用PSR-4规范。

在composer.json中添加以下模块

"autoload": {
    "psr-4": {
        "Siam\\": "Lib/Siam",
        "Monolog\\": ["src/", "lib/"],  // 如果需要尝试在多个目录下寻找某个命名空间 则使用数组
    }
},

上面代表了Siam命名空间是对应Lib/Siam目录,以Siam为命名空间的类,会尝试从该路径中加载。 Monolog命名空间下的类可能在src目录下 也可能在lib目录下,会尝试从这些路径中加载。

设置的命名空间必须以\结束


当使用classmap 、files 这两种方式引入文件的时候,每一次改动composer.json文件中的classmap或者fiels的时候  都需要使用 composer update 或者 composer dump-autoload 这样的方式进行classmap 映射文件的更新。推荐使用 composer dump-autoload 命令 该命令的作用就是:重新生成自动加载文件。如果使用composer update 命令 那么稍微不注意使用方式的话 除了 自动生成新的自动加载文件,整个vendor目录下的依赖包都会被更新到最新版本。。慎重使用composer update。。



推荐文章:【转】深入解析 composer 的自动加载原理



声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

小周博客
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复 0人评论 7,777人参与

loading