PHP中switch/case与if/else运行结果不一致 求解fun1(0)返回异常原因
问题原因分析
PHP中的switch语句会将switch()括号内的基准值,依次与每个case后表达式的返回值做松散比较(==,不校验数据类型),匹配到第一个符合条件的case后就会执行对应代码块,直到遇到break终止。
fun1(0)的执行逻辑完全符合该规则:
- 传入参数
$interval = 0,switch($interval)设定基准值为整数0 - 第一个case表达式
$interval <= 45运算结果为布尔值true,执行比较0 == true,松散比较下结果为false,匹配失败,继续向下判断 - 第二个case表达式
(90 <= $interval) && ($interval <= 100)运算结果为布尔值false,执行比较0 == false,松散比较下结果为true,匹配成功,因此执行该case下的赋值逻辑,最终返回1
fun2的if/else逻辑是直接判断每个表达式本身的布尔值是否为真,不存在额外的基准值比较步骤,因此运行结果和预期完全一致。
修复方案
如果要使用switch实现和if/else完全一致的判断逻辑,只需将switch($interval)修改为switch(true)即可。修改后switch的基准值为布尔值true,会依次匹配第一个返回true的case表达式,和if判断逻辑完全对齐:
function fun1(int $interval) { $retVal = -10; switch (true) { case ($interval <= 45): $retVal = 5; break; case ((90 <= $interval) && ($interval <= 100)): $retVal = 1; break; } return $retVal; }
内容的提问来源于stack exchange,提问作者Wakan Tanka
相关产品推荐
相关产品推荐

