PHP空合并运算符替代if语句未达预期,请求排查代码错误
PHP空合并运算符改写问题分析
问题场景
我看过不少PHP三元运算符的文章,但还是搞不定这个代码改写。下面是能正常运行的原始代码:
if ( get_field('fs_ski_resort_data_fs_name') != null && !empty(get_field('fs_ski_resort_data_fs_name') ) ) { $the_name = get_field('fs_ski_resort_data_fs_name'); } else { $the_name = get_field('fs_ski_resort_data_osm_name'); } echo 'The name'.$the_name;
但改成用空合并运算符的代码后,无法得到和原代码一致的结果:
$the_name = get_field('fs_ski_resort_data_fs_name') ?? $the_name = get_field('fs_ski_resort_data_osm_name'); echo $the_name;
错误原因
- 逻辑匹配偏差:原代码同时判断了
!= null和!empty(),但PHP的??(空合并运算符)仅检查值是否为null或未定义,不会处理空字符串、0这类empty()会判定为“空”的内容。比如当get_field('fs_ski_resort_data_fs_name')返回空字符串时,原代码会走else分支,但??会直接将空字符串赋值给$the_name,导致结果不符。 - 语法冗余且优先级问题:你在
??右侧重复写了$the_name =,这属于冗余写法,同时会因运算符优先级导致意外行为。空合并运算符的正确格式是$变量 = 表达式A ?? 表达式B,无需重复赋值。
正确写法
写法一(完全匹配原逻辑)
先存储字段值避免重复调用get_field(),再用三元运算符结合!empty()判断:
$fs_name = get_field('fs_ski_resort_data_fs_name'); $the_name = !empty($fs_name) ? $fs_name : get_field('fs_ski_resort_data_osm_name'); echo $the_name;
写法二(简化场景)
如果业务中确认get_field()返回的有效内容不会是empty()判定为空的情况(如空字符串、0),可以用简化的空合并运算符写法:
$the_name = get_field('fs_ski_resort_data_fs_name') ?? get_field('fs_ski_resort_data_osm_name'); echo $the_name;
内容的提问来源于stack exchange,提问作者spreaderman
相关产品推荐
相关产品推荐

