phpenv 不提供 PHP-DI 扩展安装功能,PHP-DI 是 Composer 包而非 PHP 扩展,需用 composer require php-di/php-di 安装,并通过 ContainerBuilder 初始化容器,禁用已废弃的 php-di/composer。

phpenv 本身不提供 PHP-DI 扩展安装功能
phpenv 是 PHP 版本管理工具,不是扩展管理器,它不负责安装、启用或配置任何 PHP 扩展(包括 php-di/php-di)。你看到的“phpEnv 安装 PHP-DI 扩展”是一种常见误解——PHP-DI 不是 PHP 扩展(即非 .so/.dll 形式),而是一个纯 PHP 的 Composer 包。它不需要编译、不修改 PHP 运行时、也不依赖 phpenv 的任何 hook 或插件。
真正要做的只有两件事:确保当前 phpenv 激活的 PHP 版本能运行 Composer,然后用 Composer 安装 php-di/php-di。
- 先确认当前 PHP 版本可用:
php -v和which php应指向~/.phpenv/versions/8.3.13/bin/php这类路径 - 确认
composer命令可用且版本 ≥ 2.5(PHP-DI 6.x 要求) - 在项目根目录执行:
composer require php-di/php-di - 不要运行
composer require php-di/composer—— 这个包已废弃,会直接破坏自动装配
为什么 php-di/composer 会导致 Class not found 错误
错误信息如 Class 'DI\Composer\Compiler' not found 不是环境没配好,而是你明确引入了一个 PHP-DI 6.x 根本不认识的类。这个类只存在于早已停止维护的 php-di/composer(4.x 时代产物),它试图在 composer install 阶段生成容器代码,但 PHP-DI 6.x 已完全移除该机制,改用运行时反射+ContainerBuilder 动态构建。
-
php-di/composer的extra.php-di配置字段在 PHP-DI 6.x 中被完全忽略 - 即使强制安装,也会与
php-di/php-di的命名空间和类加载规则冲突 - Composer 报
could not resolve package往往是因为它检测到版本约束矛盾(比如要求 PHP
PHP-DI 容器初始化必须绕过旧教程的“编译”幻觉
很多迁移项目残留着类似这样的错误写法:$container = (new Compiler())->compile(...) 或在 composer.json 里写 "php-di": { "definitions": "config/di.php" }。这些在 PHP-DI 6.x 下全部无效,也不会报错,只是默默不工作。
正确初始化只需三行 PHP 代码(无额外配置、无预编译步骤):
use DI\ContainerBuilder; $builder = new ContainerBuilder(); $builder->addDefinitions(__DIR__ . '/config/di.php'); // 可选:显式定义 $container = $builder->build();
- 不调用
compile()、不生成缓存文件、不依赖php-di/composer - 如果用自动装配(autowiring),甚至不需要
addDefinitions(),直接$container->get(SomeService::class)即可 - 注意:若用
php-di/invoker支持@Inject注解,需单独composer require php-di/invoker,但php-di/annotations已废弃
容易被忽略的兼容性断点
最麻烦的从来不是“怎么装”,而是旧文档留下的隐性依赖。比如某 CI 脚本里写了 phpenv global 7.4,但项目实际需要 PHP 8.2+ 才能跑通 PHP-DI 的类型反射;又或者 php.ini 关闭了 opcache.enable,导致自动装配性能骤降却无提示。
务必检查:
-
php -m | grep opcache—— PHP-DI 6.x 强烈依赖 OPcache 加速反射 -
composer show php-di/php-di确认版本是^6.0,而非^5.4或^4.0 - 删除所有
vendor/php-di/composer目录及composer.lock中相关条目后重装
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











