PHP中switch语句的$val===0分支为何无法触发?
问题分析:PHP中switch语句case分支无法匹配0的原因
问题代码
<?php function plusMinus($arr) { $positiveCount = $zeroCount = $negativeCount = $val = $i = 0; for( $i; $i < sizeof( $arr ); $i++ ){ $val = (int)$arr[$i]; //echo $val . " <-val - typeofval= " . gettype( $val ) . " \n"; if( $val === 0 ){ //print("zero here dude -> " . $val ); } switch ($val) { case ($val === 0): $zeroCount++; echo "scenario: val=" . $val . " === 0 \n"; echo "zero \n"; break; /* case ($val > 0): $positiveCount++; echo "scenario: val=" . $val . " > 0 \n"; echo "positive \n"; break; case ($val < 0): $negativeCount++; echo "scenario: val=" . $val . " < 0 \n"; echo "negative \n"; break;*/ default: break; } } } plusMinus( [0] );
核心原因
PHP的switch语句采用**松散比较(==)**逻辑,会将switch()中的表达式值,与每个case后的表达式值进行匹配判断。
你的代码里存在两个关键问题:
- 当
$val = 0时,$val === 0的运算结果是布尔值true - 此时switch的表达式是整数
0,需要和布尔值true做松散比较:0 == true在PHP中结果为false,所以这个case分支永远无法触发
而if语句用的是===严格比较,整数0和整数0的类型、值都完全相等,因此能正常检测到0。
修正方案
有两种常见的修正方式:
方式1:直接匹配具体值(推荐)
把case后的表达式改成具体的数值,符合switch的常规用法:
switch ($val) { case 0: $zeroCount++; echo "scenario: val=" . $val . " === 0 \n"; echo "zero \n"; break; default: // 处理正数/负数 if ($val > 0) { $positiveCount++; echo "scenario: val=" . $val . " > 0 \n"; echo "positive \n"; } else { $negativeCount++; echo "scenario: val=" . $val . " < 0 \n"; echo "negative \n"; } break; }
方式2:将switch表达式设为true,匹配条件结果
如果想保留case里的条件判断逻辑,可以把switch的表达式设为true,此时每个case的条件运算结果(布尔值)会直接和true匹配:
switch (true) { case $val === 0: $zeroCount++; echo "scenario: val=" . $val . " === 0 \n"; echo "zero \n"; break; case $val > 0: $positiveCount++; echo "scenario: val=" . $val . " > 0 \n"; echo "positive \n"; break; case $val < 0: $negativeCount++; echo "scenario: val=" . $val . " < 0 \n"; echo "negative \n"; break; }
内容的提问来源于stack exchange,提问作者eliasdev
相关产品推荐
相关产品推荐

