??= 运算符从 PHP 7.4.0 开始引入,PHP 7.3 及更早版本不支持,解析时直接报 Parse error;它仅在左侧为 null 或未定义时赋值,不覆盖 0、false、'' 等 falsy 值,且要求左侧为合法左值。

??= 是 PHP 7.4+ 特性,PHP 7.3 确实不支持
直接结论:??= 运算符从 PHP 7.4.0 开始引入,PHP 7.3 及更早版本解析时会报 Parse error: syntax error, unexpected '='。这不是配置或扩展问题,是语法层面不识别。
PHP 7.3 中想实现相同效果,只能手动模拟
不能用 ??=,但可以用 ?? + 显式赋值组合替代,语义一致且兼容:
-
$options['timeout'] = $options['timeout'] ?? 30;—— 安全,$options['timeout']未定义时不会警告(??自带 isset 检查) - 避免写
if (!isset($options['timeout'])) { $options['timeout'] = 30; },多两行且易漏掉键名拼写 - 注意:不要用
||=替代,0 ??= 30保留 0,而0 ||= 30会变成 30(因 0 是 falsy)
升级前务必检查对象属性和动态访问场景
PHP 7.4 的 ??= 支持对对象属性使用(如 $obj->prop ??= 'default'),但该行为在 PHP 8.0+ 才完整支持 __get() 触发的动态属性。若你代码里混用了魔术方法,即使升到 7.4,$obj->missingProp ??= 'x' 仍可能不按预期工作。
部署环境不一致时最容易踩的坑
本地开发是 PHP 8.1,测试环境是 7.4,线上还是 7.3 —— 这种情况下,??= 会直接让脚本中断。建议:
立即学习“PHP免费学习笔记(深入)”;
- CI 流程中强制指定目标 PHP 版本做语法检查(例如用
php -l或 PHP-CS-Fixer 配置php_version: '7.3') - 所有含
??=的代码块加注释标明最低版本要求,比如// PHP 7.4+ - 如果必须多版本兼容,封装一个辅助函数:
function set_default(&$var, $default) { $var = $var ?? $default; },调用时写set_default($config['retry'], 3);
真正容易被忽略的不是“能不能用”,而是“在哪用才安全”——数组键、普通变量、对象属性的左侧操作数是否都确保是合法左值(lvalue),否则哪怕 PHP 版本够,也会触发 Fatal error: Cannot use temporary expression in write context。



















