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

PHP中??运算符与===混用的行为异常及原因咨询

PHP中??与===混合使用的异常行为原因及解决办法

原因:运算符优先级问题

PHP里的严格相等运算符===优先级高于空合并运算符??,这导致你写的代码会被PHP按错误的顺序解析:

  • 原代码$foo["bar"] ?? "" === "baz"会被解析为$foo["bar"] ?? ("" === "baz")
  • 原代码$options["foo"] ?? '' === 'option'会被解析为$options["foo"] ?? ('' === 'option')

结合你的例子拆解:

  1. 当$foo["bar"]存在时,??运算符会直接返回左边的"baz",忽略右边的"" === "baz"(结果为false),所以var_dump输出"baz"。
  2. 当$foo["foo"]不存在时,??运算符会执行右边的"" === "baz",结果是false,所以var_dump输出false。
  3. 条件判断中,'' === 'option'结果为false,所以当$options["foo"]存在时,if判断直接用该值做非严格校验(非空字符串会被视为true),完全偏离了“判断值是否等于'option'”的预期。

解决办法

方法1:给空合并运算加括号

通过括号强制改变运算顺序,让??先执行,再做严格相等判断,这是最直接的修复方式:

var_dump(($foo["bar"] ?? "") === "baz"); // 输出true
var_dump(($foo["foo"] ?? "") === "baz"); // 输出false

// 条件判断修复后
if (($options["foo"] ?? '') === 'option') {
    // 当options.foo等于'option'时执行逻辑
}

方法2:拆分代码提升可读性

把默认值获取和判断分开写,代码逻辑更清晰,也能避免优先级问题:

$targetValue = $options["foo"] ?? '';
if ($targetValue === 'option') {
    // 执行逻辑
}

内容的提问来源于stack exchange,提问作者Philipp Wrann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:45:34