PHP 7.0.13中switch语句异常:值为0时输出Billion
问题解析:为何$value=0时switch输出Billion?
哦,这其实不是PHP的bug,而是你对switch语句的匹配逻辑理解有偏差啦!让我给你拆解一下:
问题根源:PHP switch的松散比较机制
你写的switch语句是把$value(值为0)和每个case后的表达式结果做松散比较(==),而不是直接判断case里的条件是否成立。
来看你的代码:
$value = 0; switch ($value) { case $value >= 1000000000: // 这个表达式返回false print 'Billion'; break; case $value >= 1000000: print 'Million'; break; case $value >= 1000 : print 'Thousand'; break; default: print 'Ten'; break; }
当$value=0时,第一个case的表达式$value >= 1000000000会返回false。而PHP里的松散比较规则是:0 == false的结果是true,所以switch会认为$value(0)和第一个case的结果(false)匹配,于是执行了print 'Billion'的代码。
正确的写法
如果想用switch来做范围判断,应该把switch的条件设为true,这样每个case的布尔结果会直接和true比较,符合我们的预期:
$value = 0; switch (true) { case $value >= 1000000000: print 'Billion'; break; case $value >= 1000000: print 'Million'; break; case $value >= 1000 : print 'Thousand'; break; default: print 'Ten'; break; }
此时switch会依次判断每个case的条件是否为true,当$value=0时,前面的case都不满足,就会走到default输出Ten。
当然,这种场景下用if-elseif其实更直观,代码可读性也更高:
$value = 0; if ($value >= 1000000000) { print 'Billion'; } elseif ($value >= 1000000) { print 'Million'; } elseif ($value >= 1000) { print 'Thousand'; } else { print 'Ten'; }
总结
这不是PHP的问题,而是switch的匹配逻辑导致的——它比较的是switch变量和case表达式的结果,而非case条件本身是否成立。只要调整switch的判断条件,就能得到你想要的结果啦!
内容的提问来源于stack exchange,提问作者Jimski
相关产品推荐
相关产品推荐

