You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_MINUS token
  • 同理,- - +会被拆成三个独立的token:T_MINUS、T_MINUS、T_PLUS

所以这些连续符号其实是多个合法一元运算符的连续使用,并非未知token,这是它能被正常解析的基础。

2. 运算符优先级与结合性:决定代码执行顺序

接下来看核心代码$b = - - + $a = 4的执行逻辑,要记住两个关键规则:

  • 一元运算符(-、+)的优先级高于赋值运算符(=)
  • 赋值运算符是右结合的(即从右往左依次执行)

所以这段代码的执行步骤是:

  1. 先执行最右侧的赋值:$a = 4,此时$a的值为4
  2. 执行一元正号:+ $a,结果还是4
  3. 执行第一个一元负号:- (+$a),结果为-4
  4. 执行第二个一元负号:- (-4),结果为4
  5. 最后把结果赋值给$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 13:44:06