嵌套isset三元表达式未返回预期值问题咨询
三元表达式左结合优先级导致的返回值问题解答
兄弟,这问题我太熟了!你写的嵌套三元表达式之所以没返回预期的false,核心原因是PHP里的三元运算符是左结合优先级,不是我们直觉里的嵌套if/else逻辑,导致代码执行顺序完全跑偏了。
先看你的原代码:
$val1 = null; $val2 = false; $val3 = 0; $val4 = "test"; $newValue = isset($val1) ? $val1 : isset($val2) ? $val2 : isset($val3) ? $val3 : isset($val4) ? $val4 : -1; var_dump($newValue); // 输出string(4) "test"
为啥会返回"test"?我给你拆解执行步骤:
PHP会把你的表达式按从左到右的顺序结合,实际执行逻辑是这样的:
- 先执行最左边的
isset($val1) ? $val1 : isset($val2):因为$val1是null,isset($val1)返回false,所以这部分结果是isset($val2)的返回值——true(注意:$val2是布尔值false,但变量本身存在,所以isset($val2)会返回true)。 - 现在表达式变成:
true ? $val2 : isset($val3) ? $val3 : isset($val4) ? $val4 : -1 - 继续左结合执行
true ? $val2 : isset($val3):条件为true,返回$val2也就是false。 - 表达式又变成:
false ? $val3 : isset($val4) ? $val4 : -1 - 再执行
false ? $val3 : isset($val4):条件为false,返回isset($val4)的结果true。 - 最后剩下
true ? $val4 : -1:条件为true,自然返回$val4也就是"test"。
怎么改成你想要的逻辑?
给每个嵌套的三元表达式加上括号,明确优先级,让PHP按你预期的嵌套逻辑执行:
$val1 = null; $val2 = false; $val3 = 0; $val4 = "test"; $newValue = isset($val1) ? $val1 : (isset($val2) ? $val2 : (isset($val3) ? $val3 : (isset($val4) ? $val4 : -1))); var_dump($newValue); // 现在会输出bool(false)
简单说就是:嵌套三元的时候一定要加括号,不然PHP的左结合优先级会把你的逻辑搅乱,完全不是你想的“依次判断,找到第一个存在的变量就返回”的逻辑。
内容的提问来源于stack exchange,提问作者cess
相关产品推荐
相关产品推荐

