Composer怎么安装PHP-DI库 依赖注入容器使用教程【实操】

9次阅读

直接运行 composer require php-di/php-di 即可安装最新稳定版 PHP-DI,无需额外配置即可开箱使用基础依赖注入功能;因 PHP-DI 7.x 要求 PHP 8.1+,而 6.x 支持 PHP 7.2+ 且更稳定,Composer 默认会选兼容的 6.x 最新版。

Composer怎么安装PHP-DI库 依赖注入容器使用教程【实操】

直接运行 composer require php-di/php-di 即可安装最新稳定版 PHP-DI,无需额外配置即可开箱使用基础依赖注入功能。

为什么不用 composer require php-di/php-di:6.* 这类带版本号的写法

PHP-DI 7.x 已全面转向 PHP 8.1+,若项目还在用 PHP 7.4 或 8.0,强行装 7.x 会触发 require 冲突或 ParseError;而 6.x 版本(如 6.4.2)仍支持 PHP 7.2+,且 API 兼容性更稳。Composer 默认拉取最新兼容版本,require 不加版本时它会自动选一个能跑通的——通常就是 6.x 的最新 patch 版。

  • 检查当前 PHP 版本:php -v,再查 PHP-DI 官方 composer.json"php": ">=7.2" 这类约束
  • 如果明确要 6.x,用 composer require php-di/php-di:^6.4(不写 6.*,避免意外升到不兼容的 7.0-alpha)
  • 装完后看 vendor/php-di/php-di/CHANGELOG.md 确认实际安装的是哪个大版本

ContainerBuilderContainer 怎么选

PHP-DI 6.x 起推荐用 ContainerBuilder 构建容器,而不是直接 new Container。前者支持自动扫描、注解解析、定义覆盖等关键能力;后者只是个空壳,连 get() 都可能抛 EntryNotFoundException

  • 基础用法:
    $builder = new DIContainerBuilder(); $builder->addDefinitions(['AppServiceDB' => DIcreate(AppServicePDO::class)]); $container = $builder->build();
  • 想用注解(如 @Inject),必须启用:$builder->useAnnotations(true),且需安装 php-di/annotation
  • 别在生产环境用 $builder->enableCompilation(),它生成的缓存文件依赖 opcache,本地调试时反而容易因缓存未更新导致行为不一致

常见报错:「Entry not found」却明明定义了类

最常发生在类名拼写错误、命名空间没导入、或定义路径没加 app 前缀。PHP-DI 不会自动补全命名空间,get('UserService')get('AppServiceUserService') 是两个完全不同的 entry。

立即学习PHP免费学习笔记(深入)”;

  • 定义时用完整命名空间:$builder->addDefinitions(['AppServiceUserService' => DIcreate()])
  • 获取时也必须用完整名,或提前用 autowire() 绑定别名:$builder->addDefinitions(['user_service' => DIautowire(AppServiceUserService::class)])
  • 调试技巧:dump $container->getContainer()->getDefinitions()注册表里到底有谁
  • 如果类用了 __construct 参数类型提示但没定义对应依赖,也会报这个错——PHP-DI 不会猜你要传什么,必须显式定义或启用自动注入

真正麻烦的不是装不上,而是定义写错后报错信息太泛——它不会告诉你“第 12 行的 UserService 没找到”,只会说“Entry not found”。盯住命名空间和定义键名,比查文档还管用。

text=ZqhQzanResources