PHP-DI 需用 composer require php-di/php-di:^7.0 安装,初始化必须通过 ContainerBuilder->enableAutoWiring()->addDirectory()->build(),否则 get() 会报 Entry 无法解析错误。

PHP-DI 不能直接通过 composer require php-di/php-di 安装后就开箱即用——它依赖 PHP 7.4+、PSR-11 兼容环境,且默认不自动注册自动装配(autowiring)规则,不配置就报 Entry "xxx" cannot be resolved 错误。
怎么用 Composer 正确安装 PHP-DI
PHP-DI 的主包是 php-di/php-di,但要注意版本兼容性:
- PHP 8.0+ 推荐用
php-di/php-di:^7.0(当前稳定主力版本) - PHP 7.4–7.9 可用
php-di/php-di:^6.4,但^6.0不支持 PHP 8.0+ - 别装
php-di/php-di:dev-master—— 没有稳定语义化版本,CI 构建容易崩
执行命令:
composer require php-di/php-di:^7.0
安装后会自动加载 DI\Container 类,但此时容器是空的,没有任何服务定义。
立即学习“PHP免费学习笔记(深入)”;
为什么 new Container() 后调用 get() 会报错
因为 DI\Container 默认不启用自动装配(autowiring),也不扫描类文件。哪怕类存在,$container->get(SomeService::class) 也会抛出 Entry "SomeService" cannot be resolved。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须显式启用 autowiring:传入
ContainerBuilder并调用enableAutoWiring() - 如果类有构造参数类型提示(如
__construct(LoggerInterface $logger)),还需确保这些依赖也已定义或可被自动解析 - 别跳过构建步骤:直接
new Container()是无效的,必须用ContainerBuilder->build()
正确初始化示例:
$builder = new \DI\ContainerBuilder(); $builder->enableAutoWiring(); $container = $builder->build(); // 这时才能安全 get() $service = $container->get(SomeService::class);
如何让 PHP-DI 自动加载并注入自定义类(非 PSR-4 默认路径)
PHP-DI 默认只扫描 PSR-4 自动加载路径下的类。如果你的类在 app/ 或 src/Services/ 外的目录(比如 legacy/),需要手动添加扫描路径:
- 用
addDefinitions()注册具体类映射(适合少量核心服务) - 用
addDirectory()告诉容器去哪找类(推荐,配合enableAutoWiring()) - 注意:
addDirectory()不递归扫描子目录,要写全路径,例如addDirectory('app/Services')
示例:
$builder = new \DI\ContainerBuilder();
$builder->enableAutoWiring();
$builder->addDirectory('app/Services');
$builder->addDirectory('app/Repositories');
$container = $builder->build();
常见报错和绕不开的坑
实际集成中最常卡在这几个点:
-
Class "XXX" is not instantiable:类是 abstract/interface,或没 public constructor;检查是否漏写了final或private __construct() -
Entry "YYY" cannot be resolved:要么类名拼错,要么该类没在addDirectory()范围内,要么构造函数参数类型没对应服务定义 - 用了
DI\object()定义服务但没设->constructorParameter():当构造参数名和类型不一致(比如__construct($cacheDriver)提示CacheDriverInterface),必须手动绑定 - CLI 和 Web 环境下容器行为不一致:很可能是因为 CLI 没加载
vendor/autoload.php,或用了不同入口导致ContainerBuilder实例未共享
最易被忽略的是:PHP-DI 的自动装配只认「类型提示 + PSR-4 路径 + public 构造函数」三者齐全。少一个,就得手写定义。


















