composer除了管理依赖包的功能之外,自动加载也是composer的很重要的一个功能, 我们在使用依赖包的时候,并不需要每一个文件都去加载,而是引入composer的入口文件即可调用所有依赖类。 这就是composer已经为我们实现了自动加载的功能。 我们打开一个使用了composer的目录:
在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。。
声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。
精彩评论