name: PHP Composer 和自动加载 user-invocable: false description: 当涉及 composer 包管理、PSR-4 自动加载包括依赖管理、自动加载策略、包创建、版本约束以及现代 PHP 项目组织和分发的模式时使用。 allowed-tools: []
PHP Composer 和自动加载
简介
Composer 是 PHP 的事实依赖管理器,处理包安装、自动加载和版本管理。PSR-4 自动加载通过基于命名空间和文件结构约定的自动加载类,消除了手动 require 语句。
Composer 通过提供类似于 npm、pip 或 Maven 的标准化依赖管理,彻底改变了 PHP 开发。结合 PSR-4 自动加载,Composer 使现代 PHP 项目能够整洁地组织代码、轻松共享包,并可靠地管理依赖。
本技能涵盖 Composer 基础、依赖管理、自动加载策略、包创建、语义版本控制以及可维护 PHP 项目的最佳实践。
Composer 基础
Composer 通过 composer.json 配置管理项目依赖,并将包安装到 vendor 目录。
{
"name": "company/project",
"description": "项目描述",
"type": "project",
"require": {
"php": ">=8.1",
"symfony/console": "^6.0",
"guzzlehttp/guzzle": "^7.5",
"monolog/monolog": "^3.0"
},
"require-dev": {
"phpunit/phpunit": "^10.0",
"phpstan/phpstan": "^1.10",
"squizlabs/php_codesniffer": "^3.7"
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"scripts": {
"test": "phpunit",
"lint": "phpcs",
"analyse": "phpstan analyse"
},
"config": {
"optimize-autoloader": true,
"sort-packages": true
}
}
# 安装依赖
composer install
# 安装特定包
composer require symfony/http-foundation
# 安装开发依赖
composer require --dev symfony/var-dumper
# 更新依赖
composer update
# 更新特定包
composer update monolog/monolog
# 移除包
composer remove guzzlehttp/guzzle
# 显示已安装包
composer show
# 显示过时包
composer outdated
# 验证 composer.json
composer validate
# 运行脚本
composer test
Composer 创建 composer.lock 以锁定精确的依赖版本,确保跨环境的一致性安装。
PSR-4 自动加载
PSR-4 自动加载将命名空间映射到目录,自动加载类而无需手动 require 语句。
<?php
// composer.json 自动加载配置
{
"autoload": {
"psr-4": {
"App\\": "src/",
"App\\Controllers\\": "src/Controllers/",
"App\\Models\\": "src/Models/"
}
}
}
// 目录结构
// src/
// User.php
// Controllers/
// UserController.php
// Models/
// UserModel.php
// src/User.php
namespace App;
class User {
public function __construct(
public string $name,
public string $email
) {}
}
// src/Controllers/UserController.php
namespace App\Controllers;
use App\User;
use App\Models\UserModel;
class UserController {
public function show(int $id): User {
$model = new UserModel();
return $model->find($id);
}
}
// src/Models/UserModel.php
namespace App\Models;
use App\User;
class UserModel {
public function find(int $id): User {
return new User("Alice", "alice@example.com");
}
}
// index.php - Composer 自动加载器
require __DIR__ . '/vendor/autoload.php';
use App\Controllers\UserController;
$controller = new UserController();
$user = $controller->show(1);
echo $user->name; // "Alice"
<?php
// 多种自动加载策略
{
"autoload": {
"psr-4": {
"App\\": "src/"
},
"classmap": [
"database/seeds",
"database/factories"
],
"files": [
"src/helpers.php"
]
}
}
// 更改后重新生成自动加载器
// composer dump-autoload
// 优化自动加载器用于生产
// composer dump-autoload --optimize
// composer dump-autoload --classmap-authoritative
PSR-4 消除了 require 语句,并使 PHP 项目间的项目结构保持一致。
版本约束和依赖管理
语义版本控制和版本约束控制 Composer 安装和更新的包版本。
{
"require": {
"vendor/package": "1.2.3",
"vendor/exact": "1.0.0",
"vendor/caret": "^2.0",
"vendor/tilde": "~3.1",
"vendor/wildcard": "4.*",
"vendor/range": ">=5.0 <6.0",
"vendor/latest": "dev-master",
"vendor/branch": "dev-feature-x",
"vendor/stability": "1.0@beta"
}
}
版本约束模式:
1.2.3- 精确版本^1.2.3- 脱字符:>=1.2.3 <2.0.0(兼容)~1.2.3- 波浪符:>=1.2.3 <1.3.0(类似)1.*- 通配符:>=1.0.0 <2.0.0>=1.0 <2.0- 范围:显式最小/最大值dev-master- 开发分支1.0@beta- 特定稳定性
{
"require": {
"symfony/console": "^6.0",
"monolog/monolog": "^3.0",
"guzzlehttp/guzzle": "^7.5"
},
"minimum-stability": "stable",
"prefer-stable": true
}
# 显示包安装原因
composer why vendor/package
# 显示依赖包的包
composer depends vendor/package
# 显示包提供的内容
composer show --all vendor/package
# 检查安全漏洞
composer audit
# 显示平台要求
composer check-platform-reqs
# 诊断问题
composer diagnose
语义版本控制(MAJOR.MINOR.PATCH)通过版本号传达破坏性更改、功能和修复。
创建包
创建可重用的 Composer 包可以在项目间和社区中共享代码。
{
"name": "company/http-client",
"description": "HTTP 客户端包装器",
"type": "library",
"keywords": ["http", "client", "api"],
"license": "MIT",
"authors": [
{
"name": "开发者名称",
"email": "dev@example.com"
}
],
"require": {
"php": ">=8.1",
"guzzlehttp/guzzle": "^7.5"
},
"require-dev": {
"phpunit/phpunit": "^10.0"
},
"autoload": {
"psr-4": {
"Company\\HttpClient\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
}
}
<?php
// src/Client.php
namespace Company\HttpClient;
use GuzzleHttp\Client as GuzzleClient;
class Client {
private GuzzleClient $client;
public function __construct(string $baseUrl) {
$this->client = new GuzzleClient(['base_uri' => $baseUrl]);
}
public function get(string $path): array {
$response = $this->client->get($path);
return json_decode($response->getBody(), true);
}
public function post(string $path, array $data): array {
$response = $this->client->post($path, ['json' => $data]);
return json_decode($response->getBody(), true);
}
}
// tests/ClientTest.php
namespace Tests;
use Company\HttpClient\Client;
use PHPUnit\Framework\TestCase;
class ClientTest extends TestCase {
public function testCanCreateClient(): void {
$client = new Client('https://api.example.com');
$this->assertInstanceOf(Client::class, $client);
}
}
# 验证包
composer validate
# 初始化新包
composer init
# 发布到 Packagist
# 1. 创建 GitHub 仓库
# 2. 推送带有 composer.json 的代码
# 3. 提交到 packagist.org
# 私有包
# 添加到 composer.json:
{
"repositories": [
{
"type": "vcs",
"url": "https://github.com/company/private-package"
}
]
}
设计良好的包遵循 PSR 标准,包含测试,并提供清晰的文档。
自动加载优化
优化自动加载通过减少文件系统查找来提高生产性能。
# 生成优化的自动加载器
composer dump-autoload --optimize
# 类映射权威(无文件系统检查)
composer dump-autoload --classmap-authoritative
# APCu 缓存(需要 apcu 扩展)
composer dump-autoload --apcu
{
"config": {
"optimize-autoloader": true,
"classmap-authoritative": true,
"apcu-autoloader": true
}
}
<?php
// 自动加载优化级别
// 1. 默认 PSR-4(检查文件系统)
// 最慢,灵活
// 2. 优化(构建类映射)
// 快速,如果不在映射中则检查文件系统
// 3. 权威(仅类映射)
// 最快,无文件系统检查
// 在生产中使用
// 测量影响
$start = microtime(true);
// 自动加载多个类
for ($i = 0; $i < 1000; $i++) {
$class = "App\\Service$i";
if (class_exists($class)) {
// 使用类
}
}
$duration = microtime(true) - $start;
echo "Duration: $duration seconds
";
权威类映射提供最佳性能,但需要在代码更改后重新生成。
Composer 脚本和平台
Composer 脚本自动化常见开发任务并检查平台要求。
{
"scripts": {
"test": "phpunit",
"test:unit": "phpunit --testsuite=unit",
"test:integration": "phpunit --testsuite=integration",
"lint": "phpcs --standard=PSR12 src",
"lint:fix": "phpcbf --standard=PSR12 src",
"analyse": "phpstan analyse src --level=max",
"check": [
"@lint",
"@analyse",
"@test"
],
"post-install-cmd": [
"@php artisan key:generate --ansi"
],
"post-update-cmd": [
"@php artisan vendor:publish --tag=public --ansi"
]
},
"scripts-descriptions": {
"test": "运行所有测试",
"lint": "检查代码风格",
"check": "运行所有检查"
}
}
{
"require": {
"php": "^8.1",
"ext-pdo": "*",
"ext-mbstring": "*",
"ext-intl": "*"
},
"suggest": {
"ext-redis": "用于 Redis 缓存支持",
"ext-imagick": "用于图像处理"
},
"platform": {
"php": "8.1.0"
},
"platform-check": true
}
# 运行脚本
composer test
composer run-script test
# 带参数运行
composer test -- --filter=UserTest
# 列出脚本
composer run-script --list
# 检查平台要求
composer check-platform-reqs
脚本支持 CI/CD 集成和团队成员间一致的开发工作流。
单体仓库和路径仓库
使用路径仓库在单个仓库中管理多个相关包。
{
"name": "company/monorepo",
"repositories": [
{
"type": "path",
"url": "./packages/http-client"
},
{
"type": "path",
"url": "./packages/database"
},
{
"type": "path",
"url": "./packages/auth"
}
],
"require": {
"company/http-client": "@dev",
"company/database": "@dev",
"company/auth": "@dev"
}
}
单体仓库/
├── composer.json
├── packages/
│ ├── http-client/
│ │ ├── composer.json
│ │ └── src/
│ ├── database/
│ │ ├── composer.json
│ │ └── src/
│ └── auth/
│ ├── composer.json
│ └── src/
└── vendor/
// packages/http-client/composer.json
{
"name": "company/http-client",
"autoload": {
"psr-4": {
"Company\\HttpClient\\": "src/"
}
}
}
// packages/auth/composer.json
{
"name": "company/auth",
"require": {
"company/http-client": "^1.0"
},
"autoload": {
"psr-4": {
"Company\\Auth\\": "src/"
}
}
}
路径仓库支持本地开发相互依赖的包而无需发布。
最佳实践
-
将 composer.lock 提交到版本控制,以确保跨环境的依赖版本一致
-
对依赖使用脱字符约束(^1.2.3),以允许兼容更新同时防止破坏性更改
-
使用 require 和 require-dev 分离运行时和开发依赖,用于较小的生产安装
-
使用 --classmap-authoritative 优化自动加载器用于生产,以消除文件系统检查
-
遵循 PSR-4 自动加载约定,命名空间到目录映射以保持一致性
-
在 require 部分指定最小 PHP 版本和扩展,以早期捕获兼容性问题
-
对常见任务使用脚本,以标准化团队成员间的开发工作流
-
通过定期运行 composer outdated 和更新包来保持依赖更新
-
定期用 composer validate 验证 composer.json,以捕获配置错误
-
对包使用语义版本控制,以清晰传达更改并启用自动更新
常见陷阱
-
不提交 composer.lock 导致跨环境的不同依赖版本和不可预测行为
-
使用精确版本约束(1.2.3)阻止安装安全更新和错误修复
-
盲目运行 composer update 可能引入破坏性更改;应用前审查更新
-
混合 PSR-4 与手动 require 破坏了自动加载目的并创建维护负担
-
不优化自动加载器用于生产 导致文件系统检查的性能下降
-
忽略 composer.json 验证错误 导致安装失败和难以调试的问题
-
不指定 PHP 版本要求 允许在不兼容的 PHP 版本上安装
-
对项目特定包使用全局 Composer 创建冲突和版本不匹配
-
在生产中不使用 --no-dev 标志 安装不必要的开发依赖
-
添加新类后忘记运行 dump-autoload 导致类未找到错误
何时使用此技能
使用 Composer 用于任何现代 PHP 项目,以专业地管理依赖、自动加载和包分发。
应用 PSR-4 自动加载来组织项目代码,以消除手动 require 语句并遵循行业标准。
使用版本约束来管理依赖,以平衡稳定性、安全更新和错误修复。
创建包以构建可重用的功能,这些功能可以惠及多个项目或更广泛的社区。
利用 Composer 脚本进行 CI/CD 流水线、开发工作流和自动化测试,以确保一致性。