如何正确结合三元运算符与空合并运算符实现变量判断需求?
解决PHP中按优先级判断变量返回对应值的问题
这个问题我之前也踩过坑!你原来的代码之所以没触发空合并运算符,是因为当$is_realtor为null时,三元表达式$is_realtor ? 'Yes' : 'No'会把null当成假值,直接返回'No',后面的?? 'Null'自然就不会生效了——毕竟'No'不是null,空合并只会在左侧是null的时候才会用右侧的值。
给你几个简洁优雅的实现方案,按需选择:
方案一:嵌套三元表达式(最简洁)
直接把null的判断放在最外层,确保优先级最高:
$result = $is_realtor === null ? 'Null' : ($is_realtor === 1 ? 'Yes' : 'No');
逻辑非常清晰:先严格检查是否为null,是的话返回'Null';否则再判断是否严格等于1,返回对应的'Yes'或'No'。完全符合你的需求,代码也很紧凑。
方案二:Switch语句(可读性更强)
如果觉得嵌套三元有点绕,switch的严格匹配特性刚好适配这个场景:
switch ($is_realtor) { case null: $result = 'Null'; break; case 1: $result = 'Yes'; break; default: $result = 'No'; break; }
每个分支对应一种情况,一目了然,后续维护起来也方便。
方案三:null合并结合三元的小技巧(进阶写法)
这个写法稍微有点技巧性,不过也能实现需求:
$result = ($is_realtor === 1 ? 'Yes' : ($is_realtor ?? 'Null')) ?: 'No';
原理是先判断是否为1,是的话返回'Yes';否则用null合并处理null的情况,返回'Null';如果既不是1也不是null,那么$is_realtor ?? 'Null'会得到变量本身(非null),再通过?: 'No'把假值(比如0、''等)转换成'No'。不过这个可读性不如前两种,更推荐前两个方案。
总结
核心问题就是要把null的判断放在最前面,避免被其他逻辑先处理掉,这样才能保证null的分支优先触发。
内容的提问来源于stack exchange,提问作者Joshua Leung
相关产品推荐
相关产品推荐

