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

直接运行 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确认实际安装的是哪个大版本
ContainerBuilder 和 Container 怎么选
PHP-DI 6.x 起推荐用 ContainerBuilder 构建容器,而不是直接 new Container。前者支持自动扫描、注解解析、定义覆盖等关键能力;后者只是个空壳,连 get() 都可能抛 EntryNotFoundException。
- 基础用法:
$builder = new \DI\ContainerBuilder(); $builder->addDefinitions(['App\Service\DB' => \DI\create(\App\Service\PDO::class)]); $container = $builder->build();
- 想用注解(如
@Inject),必须启用:$builder->useAnnotations(true),且需安装php-di/annotation - 别在生产环境用
$builder->enableCompilation(),它生成的缓存文件依赖 opcache,本地调试时反而容易因缓存未更新导致行为不一致
常见报错:「Entry not found」却明明定义了类
最常发生在类名拼写错误、命名空间没导入、或定义路径没加 App\ 前缀。PHP-DI 不会自动补全命名空间,get('UserService') 和 get('App\Service\UserService') 是两个完全不同的 entry。
立即学习“PHP免费学习笔记(深入)”;
- 定义时用完整命名空间:
$builder->addDefinitions(['App\Service\UserService' => \DI\create()]) - 获取时也必须用完整名,或提前用
autowire()绑定别名:$builder->addDefinitions(['user_service' => \DI\autowire(App\Service\UserService::class)]) - 调试技巧:dump
$container->getContainer()->getDefinitions()看注册表里到底有谁 - 如果类用了
__construct参数类型提示但没定义对应依赖,也会报这个错——PHP-DI 不会猜你要传什么,必须显式定义或启用自动注入
真正麻烦的不是装不上,而是定义写错后报错信息太泛——它不会告诉你“第 12 行的 UserService 没找到”,只会说“Entry not found”。盯住命名空间和定义键名,比查文档还管用。











