yii 3 要求 php ≥ 8.2,php 8.1 因版本不满足被 composer 直接拒绝安装,即使手动绕过也会因缺少 mixed 类型、构造器属性提升等特性而崩溃;psr-11 容器开箱即用,依赖必须通过构造函数注入,全局访问和 yii 2 风格配置均不支持。

PHP 8.1 不能运行 Yii 3。这是硬性限制,不是配置问题。
Yii 3 要求 PHP ≥ 8.2,PHP 8.1 直接被 Composer 拒绝安装
Yii 3 的 composer.json 明确声明 "php": ">=8.2.0"。在 PHP 8.1 环境下执行 composer create-project yiisoft/app 会立即失败,输出类似:
Your requirements could not be resolved to an installable set of packages.
不会生成任何文件,也不会降级或提示“可能兼容”——它根本不会开始安装。
- PHP 8.1 下强行改 composer.json 版本约束 → 安装后运行时大量
Fatal error: Uncaught Error: Call to undefined function yii\di\is_callable() - 即使绕过 Composer(如手动复制代码),也会因缺少 PHP 8.2 的
mixed类型、构造器属性提升(public string $name)等底层特性而崩溃 - CI/CD 中若用
php:8.1镜像,构建必然失败;必须切换为php:8.2或更高(如php:8.3-apache)
如果你已升级到 PHP 8.2+,PSR-11 容器默认启用,无需额外配置
Yii 3 的 DI 容器原生实现 Psr\Container\ContainerInterface,所有服务注册和解析都基于 get() 和 has() 方法。你只需按标准方式使用:
- 业务类中依赖
ContainerInterface,而非具体容器类:use Psr\Container\ContainerInterface; - 获取服务必须用
$container->get(LoggerInterface::class),不能用Yii::$app->get('logger')(该写法已不存在) - 全局配置统一写在
config/common.php中,键为接口名,值为具体类或工厂回调,例如:LoggerInterface::class => ['class' => FileLogger::class] - 控制器、中间件、行为等所有组件都通过构造函数注入依赖,容器自动解析类型提示
常见误配点:别把 Yii 2 的习惯带进来
很多开发者在迁移时仍沿用 Yii 2 的 ServiceLocator 思维,导致 PSR-11 优势失效:
- 在方法内调用
Yii::getContainer()->get(...)→ 违反依赖注入原则,应提前注入 - 用
Yii::$app->db这类全局访问 → Yii 3 中Yii::$app已移除,db必须作为ConnectionInterface注入 - 在配置里写 YAML 或 XML → Yii 3 只支持 PHP 数组格式的
config/*.php,不解析其他格式 - 试图给容器加自定义
set()方法或扩展make()→ 这会破坏 PSR-11 兼容性,下游库(如 PSR-15 中间件)将无法识别你的容器
真正要操心的不是“怎么配 PSR-11”,而是先确认 PHP 版本是否达标——其余都是框架自动完成的事。一旦跑在 8.2+ 上,ContainerInterface 就是开箱即用的唯一入口,没有开关,也不需要“开启兼容模式”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











