Hyperf 3.x 强制要求 PHP ≥ 8.1 且全面改用 PHP 8 Attributes 替代 Doctrine 注解,若遇 Parse error: syntax error, unexpected token "[",根本原因是 PHP 版本不达标或未正确启用 Attributes 语法,须确认 CLI 与 FPM 环境均为 PHP 8.1+ 并完成注解迁移。

Hyperf 3.x 强制要求 PHP 8.1+,并全面弃用 Doctrine 注解(如 @Inject、@GetMapping),改用 PHP 8 原生 Attributes。如果你在升级后遇到类似 SyntaxError: Unexpected token "@" 或解析失败报错,根本原因不是代码写错了,而是 PHP 解析器根本没识别到这是合法的 Attribute 语法——说明当前运行环境实际未启用 PHP 8.1+,或文件被错误地以旧版 PHP 模式加载。
PHP 版本未达标导致 Attributes 解析失败
PHP 8.0 及以下版本不支持 #[Attribute] 语法,遇到 #[Inject] 会直接报 Parse error: syntax error, unexpected token "["。这不是 Hyperf 的 bug,是语言层硬性限制。
- 运行
php -v确认 CLI 环境已是PHP 8.1.0或更高版本 - 检查 Web 服务器(如 Nginx + FPM)使用的 PHP 版本是否与 CLI 一致:
php-fpm -v或在phpinfo()页面中核对 - 某些 Docker 镜像或一键脚本仍默认拉取
php:8.0-cli,需显式改为php:8.1-cli或php:8.2-cli
注解未正确转换为 Attributes
Hyperf 3.x 不再自动兼容 Doctrine 注解。即使你保留了 @Inject 写法,框架也不会解析它,且部分组件(如 hyperf/di)在启动时就因无法识别注解而抛出解析异常。
- 必须将所有
@xxx替换为#[Xxx],例如:@Inject→#[Inject],@GetMapping→#[GetMapping] - 注意命名空间:原
use Hyperf\Di\Annotation\Inject;仍可用,但必须配合#[Inject]使用;不要混用@Inject和#[Inject] - 官方提供迁移工具:
php bin/hyperf.php code:generate -D app可批量转换控制器、服务等类中的注解,但不会处理注释里的伪注解或配置文件中的字符串
IDE 或编辑器缓存导致误报
PhpStorm、VS Code 等工具若未更新 PHP 语言级别,会把 #[...] 标记为非法语法,显示红色波浪线甚至阻止保存——但这不影响实际运行,只要 PHP 运行时正确即可。
立即学习“PHP免费学习笔记(深入)”;
- PhpStorm:File → Settings → Languages & Frameworks → PHP → Language level → 设为 “8.1” 或更高
- VS Code:检查
php.suggest.basic和intelephense.environment.phpVersion是否设为"8.1" - 重启编辑器或重新索引项目,避免缓存残留干扰判断
最易被忽略的一点:Hyperf 3.x 的 composer.json 中虽声明了 "php": "^8.1",但 Composer 不会主动阻止你在 PHP 8.0 下执行 install 或 update。这意味着你可能已成功升级依赖,却仍在旧 PHP 环境下启动服务——此时报的“语法错误”永远指向 Attributes,而不是某一行具体逻辑问题。



















