composer 是基于项目的一个库管理系统。

自动加载的类型

总体来说 composer 提供了几种自动加载类型

  • classmap: 通常用来管理不归属于命名空间的类,比如 databases 目录下的类,在配置的时候只需要配置目录路径即可
  • psr-0: 已经废弃,很少用到
  • psr-4: 通常用来管理归属于命名空间的类,我们在配置的时候只需配置根命名空间与对应目录的映射即可
  • files: helper 用 files 自动加载,我们需要配置完整的文件路径

classmap

这应该是最最简单的 autoload 模式了。大概的意思就是这样的:

然后 composer 在背后就会读取这个文件夹中所有的文件 然后再 vendor/composer/autoload_classmap.php 中将所有的 class 的 namespace + classname 生成成一个 key => value 的 php 数组

然后就可以光明正大地用 spl_autoload_register 这个函数来做自动加载了。

psr-0

现在这个标准已经过时了。 psr-0 的标准主要考虑到了 <5.2 的 php 中 类似 Acme_Util_ClassName 这样的写法。

文档结构是这样的

ClassName.php 中是这样的

由于旧版本的 php 没有 namespace 所以必须通过 _ 将类区分开。

指向一个文件夹之后 src 还要在 src 中分成好几层文档树。这样太深了。没有办法,但是似乎想要兼容 _ 的写法仔细想想这是唯一的办法了。

psr-4

最简单来讲就是可以把 prs-4 的 namespace 直接想想成 file structure

可以看到将 Acme\Util 指向了 src 之后 psr-4 就会默认所有的 src 下面的 class 都已经有了 Acme\Util 的 基本 namespace

file

然而这还是不够。因为可能会有一些全局的 helper function 的存在。

这个写法很简单就不多看了。

加载说明

vendor/composer/autoload_real.php

有个类似于这样的class

为了不让这个 autoload 的 helper 污染全局,composer 的仁兄们还是绞尽脑汁怒弄了这么一个奇怪的 hash。这直接就逼迫广大二笔程序员们不要跟这个撞衫。

主要的操作在getLoader 方法

  • 找 Composer\ClassLoader 如果不存在就是生成一个实例放在 ComposerAutoloaderInit892def2c33a81b0e9dd0ef18c041f880 中
  • 然后将 composer cli 生成的各种 autoload_psr4, autoload_classmap, autoload_namespaces(psr-0) 全都注册到 Composer\ClassLoader 中。
  • 直接 require 所有在 autoload_files 中的文件

外面还有一个

如果有人在 autoload_files 中的文件中写了 $this 或者 self 那就屎了。所以当require 一个file的时候我们希望解释器能够成功报错。


REFERENCE

分类: 后端

0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注