composer autoload

对于类库的自动加载,Composer 生成了一个 vendor/autoload.php 文件。引入这个文件,就能得到一个免费的自动加载支持。

本文主要是介绍如何利用 Composer 自带的自动加载机制,加载本地自定义的包(即不是来自于 packagist)。

使用

在 composer.json 文件中的 autoload 字段中添加自己的 autoloader。

框架结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
First/
|---examples/
|---get.php
|---src/
|---Curl.php
|---vendor/
|---composer/
|---autoload.php
|---composer.json
|---classmap
|---lib
|---src
|---ext
|---common
| |---functions
|---system
|---functions
介绍PSR-4自动加载方式
1
2
3
4
5
6
7
8
{
"autoload": {
"psr-4": {
"First\\": "src/",
"Temp\\": "lib/"
}
}
}

上面的代码采用 PSR-4 规范,该规范包含了 PHP 最新的自动加载标准,它要求必须使用 namespace (命名空间)的方式。

First\ 表示命名空间,必须以 \ 结尾,避免相似的命名空间导致冲突,若包含子命名空间,可以这样表示:First\Second\。

src/ 表示命名空间所在目录为与 Composer 的 vendor 目录同级的 src 目录,如上图框架结构所示。

如果需要在多个目录下搜索相同的命名前缀,可以用一个数组提供:

1
2
3
4
5
6
7
{
"autoload": {
"psr-4": {
"First\\": ["src/", "lib/"]
}
}
}

修改完 composer.json 的 autoload 字段后需要更新一下 Composer 的自动加载类:

1
composer dump-autoload

对应 Curl.php 的命名空间如下表示:

1
2
3
4
5
6
7
<?php
namespace First;

class Curl
{

}

引用 Curl.php 的方式如下:

1
2
3
4
5
6
7
8
<?php
require '../vendor/autoload.php';

use First\Curl;

$curl = new Curl();
. . .
. . .
classmap模式

懒加载,扫描目录下的所有类文件,支持递归扫描, 生成对应的类名=>路径的映射,当载入需要的类时直接取出路径,速度最快
composer.jsonautoload中添加:

1
2
3
4
// classmap 扫描目录下的所有类文件 生成对应的类名=>路径的映射
"classmap": [
"classmap/lib/src/"
]
files模式

自动载入的文件,主要用来载入一些没办法懒加载的公共函数
composer.jsonautoload中添加:

1
2
3
4
5
6
// 扫描目录下的所有文件生成 hash => 路径的映射  运行时实时加载
// 主要用来载入工具函数
"files": [
"ext/common/functions.php",
"ext/system/functions.php"
]