composer init仅生成composer.json,不创建psr-11容器、不建目录、不写代码;支持psr-11需手动引入实现(如php-di)、配置autoload、创建src/目录并编码实现containerinterface。

直接说结论: composer init 本身不生成 PSR-11 容器或任何目录结构,它只创建 composer.json;要支持 PSR-11 容器注入,你得手动选依赖、写代码、组织目录——composer init 只是起点,不是解决方案。
为什么 composer init 不会生成 PSR-11 目录结构
这个命令本质是交互式生成基础 composer.json:填包名、描述、依赖(可选)、autoload 配置(可选)。它不创建 PHP 类、不建 src/ 或 config/ 目录,更不帮你实现 ContainerInterface。所谓“PSR-11 支持”,必须靠你引入具体实现(如 php-di/php-di、container-interop/container-interop 或 league/container),再按需编码。
-
composer init运行完,项目根目录只有composer.json,啥都没有 - 即使你选了 PSR-4 autoload,它也只写配置,不建
src/文件夹,也不生成任何类 - PSR-11 是接口规范,不是框架——没哪个 Composer 命令能“一键注入容器结构”
如何用 composer init 打好基础,再补 PSR-11 支持
可以把它当快速入口,但后续几步不能跳过:
- 运行
composer init,填好包名(如myapp/core)、设置autoload为 PSR-4,比如"MyApp\": "src/" - 手动创建
src/目录,并在里面加一个空的Container.php或直接 require 容器实现:composer require php-di/php-di - 在
src/下新建Application.php,构造函数接收PsrContainerContainerInterface,这是 PSR-11 注入的典型用法 - 确保
composer.json的autoload和autoload-dev正确,否则ContainerInterface找不到——尤其注意命名空间大小写和路径斜杠方向
常见错误:autoload 写错导致 PSR-11 接口找不到
PSR-11 规范定义在 psr/container 包里,但它的接口(如 PsrContainerContainerInterface)需要被自动加载。很多人卡在这一步:
- 没执行
composer require psr/container,就直接use PsrContainerContainerInterface→ 报错Class 'PsrContainerContainerInterface' not found -
composer.json里 autoload 的 namespace 和路径不匹配,比如写了"MyApp\": "src"却把文件放在src/Container.php,而类声明是class Container implements PsrContainerContainerInterface——这没问题;但如果类写成namespace MyApp;而文件放错位置,就会加载失败 - 改完
composer.json没运行composer dump-autoload,导致新配置不生效
真正麻烦的不是命令怎么敲,而是目录意图和依赖职责要对齐:PSR-11 是契约,composer init 不管契约落地,它只管包元数据。你得自己决定用哪个容器实现、哪些类该放进 src/、哪些配置该放 config/——这些全靠手建,没有捷径。











