用途
PHP Composer and Autoloading 面向现代 PHP 项目,用于管理依赖、自动加载与包分发。Composer 是 PHP 事实上的依赖管理器,处理包安装、自动加载和版本管理;PSR-4 自动加载通过命名空间与文件结构约定自动加载类,替代手动 require 语句。该技能适用于希望规范组织 PHP 代码、可靠管理依赖的开发者。
主要能力
Composer 通过 composer.json 配置管理项目依赖,并将包安装到 vendor 目录。示例配置包含 name、description、type、require、require-dev、autoload、autoload-dev、scripts、config 等字段,并在 require 中声明 php、symfony/console、guzzlehttp/guzzle、monolog/monolog 等依赖,在 require-dev 中声明 phpunit/phpunit、phpstan/phpstan、squizlabs/php_codesniffer。autoload 使用 psr-4 将命名空间映射到目录。Composer 会创建 composer.lock 锁定确切依赖版本,保证不同环境下安装一致。
PSR-4 自动加载将命名空间映射到目录,自动加载类而无需手动 require。示例展示 App\、App\Controllers\、App\Models\ 到 src/ 及子目录的映射,以及对应命名空间下的 User、UserController、UserModel 类,index.php 只需引入 vendor/autoload.php。除 psr-4 外,还可使用 classmap 与 files 策略;修改后可用 composer dump-autoload 重新生成,生产环境可用 --optimize 或 --classmap-authoritative。
使用方式
依赖管理命令包括:composer install 安装依赖,composer require 安装指定包,composer require --dev 安装开发依赖,composer update 更新依赖,composer update 指定包,composer remove 移除包,composer show 显示已安装包,composer outdated 显示过时包,composer validate 校验 composer.json,composer test 运行脚本。版本约束模式包括: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 指定稳定性。可通过 minimum-stability 与 prefer-stable 控制稳定性。辅助命令包括 composer why、composer depends、composer show --all、composer audit、composer check-platform-reqs、composer diagnose。
包创建方面,composer.json 可包含 name、description、type、keywords、license、authors、require、require-dev、autoload、autoload-dev 等字段,示例创建 Company\HttpClient\Client 类并配合 PHPUnit 测试。可用 composer validate 校验、composer init 初始化,发布到 Packagist 需创建 GitHub 仓库、推送含 composer.json 的代码并提交到 packagist.org;私有包可通过 repositories 配置 type 为 vcs 的仓库地址。
自动加载优化提供三个层级:默认 PSR-4 会检查文件系统,最慢但灵活;优化模式构建类映射,较快;authoritative 仅用类映射,不检查文件系统,最快,用于生产环境,但代码变更后需重新生成。对应命令为 composer dump-autoload --optimize、--classmap-authoritative、--apcu,也可在 config 中设置 optimize-autoloader、classmap-authoritative、apcu-autoloader。
Composer 脚本可自动化常见任务,示例定义 test、test:unit、test:integration、lint、lint:fix、analyse、check、post-install-cmd、post-update-cmd,并通过 scripts-descriptions 描述脚本。平台部分可在 require 中声明 php、ext-pdo、ext-mbstring、ext-intl,在 suggest 中建议 ext-redis、ext-imagick,并可用 platform 与 platform-check 设置。运行脚本可使用 composer test、composer run-script test、composer test -- --filter=UserTest、composer run-script --list、composer check-platform-reqs。
monorepo 与路径仓库通过 repositories 中的 type 为 path 的条目管理同一仓库内多个相关包,示例包含 company/http-client、company/database、company/auth,依赖使用 @dev,便于在不发布的情况下本地开发互相依赖的包。
适用场景
适用于任何现代 PHP 项目,用于专业地管理依赖、自动加载和包分发;在组织项目代码时应用 PSR-4 自动加载以消除手动 require;在管理依赖时采用版本约束以平衡稳定性与安全更新和缺陷修复;在构建可被多个项目或社区复用的功能时创建包;在 CI/CD 流水线、开发工作流和自动化测试中使用 Composer 脚本以保证一致性。
限制与注意事项
资料列出若干常见陷阱:不提交 composer.lock 会导致不同环境依赖版本不一致、行为不可预测;使用精确版本约束会阻止安装安全更新与缺陷修复;盲目运行 composer update 可能引入破坏性变更,应先审查;混合 PSR-4 与手动 require 会背离自动加载目的并增加维护负担;不为生产优化自动加载器会因文件系统检查导致性能下降;忽略 composer.json 校验错误会导致安装失败和难以调试的问题;不指定 PHP 版本要求会使安装发生在不兼容的 PHP 版本上;用全局 Composer 处理项目特定包会造成冲突和版本不匹配;生产安装不使用 --no-dev 会安装不必要的开发依赖;添加新类后忘记运行 dump-autoload 会导致类未找到错误。最佳实践建议提交 composer.lock、使用插入符约束、用 require 与 require-dev 分离运行时与开发依赖、生产环境用 --classmap-authoritative 优化、遵循 PSR-4 约定、在 require 中指定最低 PHP 版本与扩展、使用脚本标准化工作流、定期运行 composer outdated 更新、定期用 composer validate 校验、使用语义化版本。