PHP中减号(连字符)与加号为何可在代码中几乎任意位置生效?
拆解那段“奇怪”的PHP代码:为什么它在PHP 4.3.0至7.4.2中合法?
咱们先把问题里的代码摆出来,方便一步步分析:
- - $c = 5; $a = 4; $b = - - + $a = 4; echo $b;
运行后输出是4,乍一看那些连续的-和+像乱码,但其实这是PHP词法解析逻辑和运算符规则共同作用的结果,咱们慢慢拆解:
1. 词法解析:把连续符号拆成合法token
你提到这些符号不在官方token列表里,但其实PHP的词法分析器(tokenizer)会尽可能将字符序列拆分为最长的合法token,但这里的特殊情况是:
- 单独的
-作为一元负号运算符是合法token(T_MINUS),单独的+作为一元正号也是合法token(T_PLUS) - 这里的
- -并不是递减运算符(T_DEC),因为递减运算符要求紧跟变量(比如--$a或$a--),而代码里-后面是另一个-,所以tokenizer会把它们拆成两个独立的T_MINUStoken - 同理,
- - +会被拆成三个独立的token:T_MINUS、T_MINUS、T_PLUS
所以这些连续符号其实是多个合法一元运算符的连续使用,并非未知token,这是它能被正常解析的基础。
2. 运算符优先级与结合性:决定代码执行顺序
接下来看核心代码$b = - - + $a = 4的执行逻辑,要记住两个关键规则:
- 一元运算符(
-、+)的优先级高于赋值运算符(=) - 赋值运算符是右结合的(即从右往左依次执行)
所以这段代码的执行步骤是:
- 先执行最右侧的赋值:
$a = 4,此时$a的值为4 - 执行一元正号:
+ $a,结果还是4 - 执行第一个一元负号:
- (+$a),结果为-4 - 执行第二个一元负号:
- (-4),结果为4 - 最后把结果赋值给
$b,所以$b的值是4,最终输出4
3. 为什么限定在PHP 4.3.0至7.4.2版本?
在PHP 4.3.0之前,词法解析器的规则不够完善,无法正确拆分这种连续的一元运算符组合,会判定为语法错误;而在PHP 8.0及以后的版本中,虽然基础逻辑没变,但语法检查变得更严格,这类容易引发歧义的写法可能会被抛出警告或直接判定错误,不过核心原因还是4.3.0到7.4.2这个区间的PHP版本,tokenizer允许将连续一元运算符拆分为独立合法token,且运算符规则完全支持这种写法。
内容的提问来源于stack exchange,提问作者user5542121
相关产品推荐
相关产品推荐

