PHP中使用is_numeric作为case的switch语句无法匹配正确分支
问题根因
PHP的switch语句使用*松散比较(==)*规则,将switch()括号内的表达式值,依次和每个case后的值做相等判断,满足则进入对应分支。
你当前的代码触发异常分支是两个错误叠加导致的:
- 你的代码逻辑预期是“当
$get_category满足is_numeric判定时进入分支”,但实际写法是将is_numeric($get_category)的布尔返回值作为了case的匹配值,和switch($get_category)里的字符串变量做比较。 - 当
$get_category为空字符串''时,is_numeric($get_category)的返回值为布尔值false,PHP松散比较规则中'' == false的结果为true,所以直接匹配到了第一个case,不会继续向下匹配case ''的分支。
你可以通过一行代码验证这个比较规则:
var_dump('' == false); // 输出结果为 bool(true)
修复方案
有两种常用的修复方式可选:
方式1:调整switch匹配逻辑为匹配布尔值true
将switch的参数改为true,即可实现“哪个case的表达式结果为true就进入哪个分支”的效果,符合你最初的逻辑预期:
if (isset($_GET['cat'])) { $get_category = trim($_GET['cat']); switch (true) { case is_numeric($get_category): echo 'is_numeric'; // execute query break; case 'newest': echo 'newest'; // execute query break; case '': echo 'empty'; // execute query break; } }
方式2:拆分判断逻辑
先单独处理数值判断的场景,剩余的固定字符串场景再走switch匹配,逻辑更清晰:
if (isset($_GET['cat'])) { $get_category = trim($_GET['cat']); // 先单独处理数值场景 if (is_numeric($get_category)) { echo 'is_numeric'; // execute query } else { // 剩余固定字符串走switch匹配 switch ($get_category) { case 'newest': echo 'newest'; // execute query break; case '': echo 'empty'; // execute query break; } } }
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

