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

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'的实际运算顺序是:

  1. 先执行优先级更低的??:'hello' ?? 'a' → 结果为'hello'(因为'hello'非null)
  2. 再执行三元运算:'hello' ? 'b' : 'c' → 非空字符串在PHP中视为布尔true,因此返回'b'

你误以为??会直接返回'hello'并终止后续运算,但实际上因为优先级问题,??的结果会被当作三元运算的条件,而非整个表达式的最终结果。

2. 第二个示例执行逻辑

表达式'hello' ?? 'b' ?: 'c'的实际运算顺序是:

  1. 先执行优先级更高的??:'hello' ?? 'b' → 结果为'hello'
  2. 再执行短三元运算:'hello' ?: 'c' → 左侧为真,直接返回'hello'

3. 第三个示例执行逻辑

括号强制改变了运算顺序:

  1. 先执行括号内的三元运算:'a' ? 'b' : 'c' → 结果为'b'
  2. 再执行??运算:'hello' ?? 'b' → 'hello'非null,直接返回'hello'

解决方法

如果想让第一个示例返回'hello',只需给??的右侧部分加括号,强制先执行三元运算,再进行空合并判断:

var_dump('hello' ?? ('a' ? 'b' : 'c'));
// 输出: 'hello'

内容的提问来源于stack exchange,提问作者Rick Kukiela

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 09:03:19