必须通过 containerbuilder 构建容器,不能直接 new \di\container();正确包名是 php-di/php-di,php 7.4–8.0 用 ^6.4、≥8.1 用 ^7.0;接口需显式绑定,框架集成须用对应桥接器。

直接运行 composer require php-di/php-di 就能装上,但装完不能直接用——new \DI\Container() 会立刻报 EntryNotFoundException,必须走 ContainerBuilder 构建流程。
安装命令写错就找不到包
PHP-DI 的唯一正确包名是 php-di/php-di,不是 php-di/composer、PhpDiPhpDi 或带下划线的变体。后者早已归档废弃,装了会报 Could not find package 或引发 Class not found 错误。
- 执行
composer require php-di/php-di(不加版本号,让 Composer 自动选兼容版) - 若项目 PHP 版本是 7.4–8.0,加
^6.4:composer require php-di/php-di:^6.4 - 若 PHP ≥ 8.1,可加
^7.0:composer require php-di/php-di:^7.0 - 装完检查
vendor/php-di/php-di/CHANGELOG.md首行,确认实际安装的是 6.x 还是 7.x
ContainerBuilder 是唯一安全入口
\DI\Container 类本身没有无参构造函数,也不支持开箱即用的自动装配。所有初始化必须经由 ContainerBuilder,否则 get() 调用必然失败。
- 入口文件(如
public/index.php)开头确保有require 'vendor/autoload.php'; - 别写
new \DI\Container()—— 这是空壳,连基本解析都做不了 - 必须用:
$container = (new \DI\ContainerBuilder())->build(); - 启用自动装配:
$builder->enableAutoWiring();(6.x 写法是useAutowiring(true)) - 扫描路径要写全:
$builder->addDirectory('app/Services');(不递归,子目录需单独加)
接口和抽象类必须显式绑定
PHP-DI 默认只对具体类启用自动装配,LoggerInterface、UserRepository 这类接口或抽象类不会被自动识别,不绑定就会报 Entry "LoggerInterface" cannot be resolved。
- 用
addDefinitions()绑定:$builder->addDefinitions([LoggerInterface::class => \DI\create(FileLogger::class)]); - 别用已废弃的
set()方法(7.x 中标记为 deprecated) - 定义和获取时命名空间必须完全一致:
get('App\Service\UserService')≠get('UserService') - 调试时可用
dump($container->getContainer()->getDefinitions());查看当前注册表
Slim 或 ThinkPHP 集成要绕过框架容器
主流框架(Laravel/Symfony/Slim/ThinkPHP)自带容器,PHP-DI 不能直接替换它们的核心容器实例,否则会破坏生命周期钩子或导致服务覆盖混乱。
- Slim 4+ 必须装
php-di/slim-bridge,再用DI\Bridge\Slim\App包装容器,不能传裸Container给\Slim\App - ThinkPHP 中应通过
app()->bind('Psr\Container\ContainerInterface', $diContainer)替换接口实现,而非覆盖think\Container实例 - 关键服务(如
ServerRequestInterface、ResponseInterface)需手动绑定,框架不会自动注入 - 控制器方法签名中用类型提示(如
public function index(UserService $service))才有效,__construct()会被绕过
真正容易卡住的地方不是装哪个包,而是旧教程残留的 php-di/composer 引用、没清掉的 extra.php-di 配置、或者以为 new Container() 就能跑起来——这些都会让容器在第一次 get() 时静默失败。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











