PHP中??运算符与===混用的行为异常及原因咨询
PHP中
??与===混合使用的异常行为原因及解决办法 原因:运算符优先级问题
PHP里的严格相等运算符===优先级高于空合并运算符??,这导致你写的代码会被PHP按错误的顺序解析:
- 原代码
$foo["bar"] ?? "" === "baz"会被解析为$foo["bar"] ?? ("" === "baz") - 原代码
$options["foo"] ?? '' === 'option'会被解析为$options["foo"] ?? ('' === 'option')
结合你的例子拆解:
- 当
$foo["bar"]存在时,??运算符会直接返回左边的"baz",忽略右边的"" === "baz"(结果为false),所以var_dump输出"baz"。 - 当
$foo["foo"]不存在时,??运算符会执行右边的"" === "baz",结果是false,所以var_dump输出false。 - 条件判断中,
'' === '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
相关产品推荐
相关产品推荐

