必须升级PHP至7.0+,因为??是PHP 7.0引入的空合并操作符,低版本解析器不认识该符号,词法分析阶段即报Parse error: syntax error, unexpected '?'。

必须升级 PHP 至 7.0+,否则所有含空合并操作符(??)或空合并赋值(?=)的代码都会直接报错。
为什么 ?? 会触发 Parse error: syntax error, unexpected '?'?
这是典型的 PHP 版本不兼容问题。?? 是 PHP 7.0 引入的空合并操作符,PHP 5.6 或更低版本根本不认识这个符号,解析器在词法分析阶段就卡住,报出 unexpected '?'。ThinkPHP6 源码(尤其是 think-helper、think-orm 等组件)大量使用了该语法,因此低版本 PHP 下连 vendor/autoload.php 都无法完整加载。
常见触发点:
-
vendor/topthink/think-helper/src/helper.php第 233 行左右的$value ?? [] - 自定义中间件或模型中写了
$config['host'] ?? 'localhost' - 使用了 TP6 新版扩展(如
think-swoole)中带?->或??的代码
如何快速确认是不是 PHP 版本问题?
执行以下命令,看输出是否 ≥ 7.0:
立即学习“PHP免费学习笔记(深入)”;
php -v
如果显示类似 PHP 5.6.40 或 PHP 7.0.33 以下版本,就是根源。注意:WampServer/XAMPP 界面切换 PHP 版本 ≠ 系统环境变量更新 —— 命令行仍可能调用旧版本。
验证方法:
- 在项目根目录运行
php -r "echo version_compare(PHP_VERSION, '7.0.0', '>=') ? 'OK' : 'FAIL';",输出FAIL即确认 - 在
public/index.php开头加die(PHP_VERSION);,访问网页看实际运行版本
升级 PHP 后还要检查三处隐藏坑
即使 PHP -v 显示 7.2+,仍可能因环境错位导致报错重现:
- Web 服务器(Nginx/Apache)和 CLI 使用不同 PHP SAPI —— 宝塔用户需在网站设置 → PHP 版本 和 PHP 管理 → 当前版本 两处都设对
- Composer 安装时用了旧 PHP,导致 vendor 中部分文件已按低版本解析缓存 —— 必须删掉
vendor/和composer.lock,再用新 PHP 运行composer install - 某些共享主机或 Docker 镜像虽标称 PHP 7.4,但禁用了
opcache或启用了严格模式,可临时加ini_set('error_reporting', E_ALL & ~E_DEPRECATED);排查干扰项
最易被忽略的是:错误可能只在 CLI(如 php think 命令)下出现,而 Web 请求正常,或反之 —— 因为 CLI 和 FPM 的 php.ini 往往是两个文件,扩展启用状态、display_errors 设置都可能不同。



















