直接运行 composer require php-di/php-di 即可安装,禁用已废弃的 php-di/composer(2017年归档);php 8.1+ 用 ^7.0,php 7.4/8.0 用 ^6.4;必须通过 containerbuilder 构建容器并显式启用 autowiring 或定义绑定,不可 new container()。

直接运行 composer require php-di/php-di 就行,别装 php-di/composer——它早在 2017 年就归档废弃,装了反而报 Class not found 或引发依赖冲突。
为什么装 php-di/php-di 却提示包不存在
常见错误现象是执行 composer require php-di/php-di 后报错 Package php-di/php-di is not found。
- 确认你没拼错包名:不是
php-di/container、php_di/php_di或带下划线的旧写法 - 检查是否误用了
composer install:这个命令只读composer.lock,新包必须用require或update - 确认 Packagist 镜像可用(比如国内用阿里云镜像时需
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/) - 若仍失败,手动在
composer.json中加一行:"php-di/php-di": "^7.0",再运行composer update php-di/php-di
ContainerBuilder 必须用,不能直接 new Container()
装完后直接 new \DI\Container() 是无效的——它不加载任何定义,调用 get() 几乎必抛 Entry "xxx" cannot be resolved。
- 正确初始化方式是:
$builder = new \DI\ContainerBuilder(); $container = $builder->build(); - 若要启用自动装配(autowiring),必须显式调用
$builder->enableAutoWiring() - 若要扫描目录下类(如
app/Services),用$builder->addDirectory('app/Services');注意它不递归子目录,路径要写全 - 接口或抽象类无法自动解析,必须显式绑定,例如:
$builder->addDefinitions([LoggerInterface::class => \DI\create(FileLogger::class)])
PHP 版本和注解支持的实际约束
PHP-DI 7.x 要求 PHP ≥ 8.1,但很多项目还在用 PHP 7.4 或 8.0——这直接影响你该装哪个版本。
- PHP 8.1+:推荐
composer require php-di/php-di:^7.0 - PHP 7.4 / 8.0:必须锁定
composer require php-di/php-di:^6.4,否则 Composer 会试图拉 7.x 导致解析失败 - 注解(如
@Inject)需额外安装php-di/invoker(不是已废弃的php-di/annotations),且仅开发环境建议开启:$builder->useAnnotations(true) - 生产环境禁用注解扫描是默认行为,不是 bug;真要提速,应走
enableCompilation()+ 预生成缓存,而非硬开反射
真正卡住人的地方,往往不是“装什么”,而是旧教程残留的 php-di/composer 引用没清理干净,或者定义时用了短类名(如 UserService)而 get() 时却传完整命名空间——这两处不一致,容器就完全对不上号。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











