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

PHP空合并运算符优先级为何呈现此运行逻辑?

PHP空合并运算符优先级导致的意外执行逻辑

PHP中空合并运算符(??)的优先级低于多数比较运算符,这会导致一些看似符合直觉的代码执行结果超出预期,以下是对两个错误示例的执行步骤拆解:

示例1(错误写法)

$var['x'] = "5";
if ((int)$var['x']??0 < 1 ) {
    print "less than 1"; /* outputs this */
}
else {
    print "more than 1";
}

执行步骤:

  1. 按运算符优先级从高到低执行:类型转换(int) > 比较运算符< > 空合并??
  2. 先处理类型转换:(int)$var['x']得到整数5
  3. 再执行比较运算:0 < 1得到布尔值true
  4. 最后执行空合并:5 ?? true,因为左侧的5不为null,表达式结果为5
  5. if条件判断时,整数5会被转为布尔值true,因此进入第一个分支,输出less than 1

示例2(错误写法)

$var['x'] = "5";
if ($var['x']??5 < 1 ) {
    print "less than 1"; /* still outputs this */
}
else {
    print "more than 1";
}

执行步骤:

  1. 同样遵循优先级:< > ??
  2. 先执行比较运算:5 < 1得到布尔值false
  3. 再执行空合并:$var['x'] ?? false,因为$var['x']存在且不为null,表达式结果为字符串"5"
  4. if条件判断时,非空字符串"5"被转为布尔值true,因此进入第一个分支,输出less than 1

示例3(正确写法)

$var['x'] = "5";
if ((int)($var['x']??0) < 1 ) {
    print "less than 1";
}
else {
    print "more than 1";
}

执行步骤:

  1. 括号强制改变执行顺序,先处理$var['x']??0,得到字符串"5"
  2. 再执行类型转换(int)"5"得到整数5
  3. 最后执行比较运算:5 < 1得到布尔值false
  4. if条件判断为false,进入else分支,输出正确结果more than 1

核心原因:空合并运算符??的优先级低于比较运算符,必须通过括号明确限定空合并的运算范围,才能让代码按照预期的逻辑执行。

内容的提问来源于stack exchange,提问作者Mm-Art-In

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 14:38:26