升级PHP时这种接收多返回值的写法为什么报unexpected '='错误
问题原因分析
1. 语法版本兼容问题
你写的短数组解构赋值语法 [$userID, $activationIDref, $expiry] = user_id_lookup($mysqli, $aid) 是 PHP 7.1 版本才新增的特性,用来替代传统的list()写法:
// 等价的旧版本写法 if (!list($userID, $activationIDref, $expiry) = user_id_lookup($mysqli, $aid))
如果你的测试服务器当前PHP版本低于7.1,解析器会把开头的[识别为普通数组定义,遇到后面的=就会判定为非法语法,直接抛出unexpected '='的解析错误。你可以先对比生产和测试环境的PHP版本,大概率是测试环境版本低于生产环境的7.1+版本。
2. 存在运算符优先级的隐藏问题
就算测试环境升级到PHP7.1及以上版本,你当前的写法也不符合预期:逻辑非运算符!的优先级高于赋值运算符=,代码会被解析为先对数组[$userID, $activationIDref, $expiry]求非(结果固定为布尔值false),再尝试把函数返回值赋值给false,逻辑完全错误。
要实现你想要的「先赋值、再判断函数返回值是否为假」的逻辑,需要把整个赋值表达式用括号包裹:
if (!([$userID, $activationIDref, $expiry] = user_id_lookup($mysqli, $aid))) { //rest of function }
临时兼容方案
如果暂时不能统一测试环境和生产环境的PHP版本,可以改成兼容更低版本的list()写法:
if (!list($userID, $activationIDref, $expiry) = user_id_lookup($mysqli, $aid)) { //rest of function }
内容的提问来源于stack exchange,提问作者Shaun
相关产品推荐
相关产品推荐

