PHP 7.4:空合并运算符结合三元运算符结果不符预期的原因
PHP 7.4中空合并与三元运算符的优先级问题
你遇到的问题核心是PHP运算符优先级导致的运算顺序不符合预期,下面逐个拆解三个示例的执行逻辑:
测试代码回顾
var_dump('hello' ?? 'a' ? 'b' : 'c'); // 输出: 'b' var_dump('hello' ?? 'b' ?: 'c'); // 输出: 'hello' var_dump('hello' ?? ('a' ? 'b' : 'c')); // 输出: 'hello'
原因分析
PHP中不同运算符的优先级决定了表达式的执行顺序:
- 三元运算符
? :的优先级高于空合并运算符?? - 短三元运算符
?:的优先级低于空合并运算符??
1. 第一个示例执行逻辑
表达式'hello' ?? 'a' ? 'b' : 'c'的实际运算顺序是:
- 先执行优先级更低的
??:'hello' ?? 'a'→ 结果为'hello'(因为'hello'非null) - 再执行三元运算:
'hello' ? 'b' : 'c'→ 非空字符串在PHP中视为布尔true,因此返回'b'
你误以为??会直接返回'hello'并终止后续运算,但实际上因为优先级问题,??的结果会被当作三元运算的条件,而非整个表达式的最终结果。
2. 第二个示例执行逻辑
表达式'hello' ?? 'b' ?: 'c'的实际运算顺序是:
- 先执行优先级更高的
??:'hello' ?? 'b'→ 结果为'hello' - 再执行短三元运算:
'hello' ?: 'c'→ 左侧为真,直接返回'hello'
3. 第三个示例执行逻辑
括号强制改变了运算顺序:
- 先执行括号内的三元运算:
'a' ? 'b' : 'c'→ 结果为'b' - 再执行
??运算:'hello' ?? 'b'→'hello'非null,直接返回'hello'
解决方法
如果想让第一个示例返回'hello',只需给??的右侧部分加括号,强制先执行三元运算,再进行空合并判断:
var_dump('hello' ?? ('a' ? 'b' : 'c')); // 输出: 'hello'
内容的提问来源于stack exchange,提问作者Rick Kukiela
相关产品推荐
相关产品推荐

