PHP中switch传入0或true匹配首个case而非default的原因问询
问题解析:为什么传入0或true会匹配'equals'分支?
这是PHP中**松散比较(==)**的特性导致的,而switch语句默认使用的就是松散比较规则,我们来逐个拆解原因:
1. 传入0时的匹配逻辑
当你调用someFunction(0),switch会用0和每个case的值做松散比较:
- 第一个case是字符串
'equals',PHP在比较数字与字符串时,会自动把字符串转换为数字。由于'equals'开头没有有效数字,转换结果是0。此时0 == 'equals'就等价于0 == 0,结果为true,所以直接命中第一个case,返回'='。
2. 传入true时的匹配逻辑
当你调用someFunction(true),switch会把case中的字符串转换为布尔值来比较:
- 所有非空字符串在布尔转换中都会被判定为
true,所以true == 'equals'就等价于true == true,结果为true,因此也会匹配第一个case,返回'='。
解决方案:使用严格比较避免意外匹配
要规避这种类型转换带来的问题,我们可以修改switch的写法,改用严格比较(===),确保值和类型完全匹配:
function someFunction($myKey){ switch(true){ case $myKey === 'equals': $condition = '='; break; case $myKey === 'notequals': $condition = '!='; break; default: $condition = 'like'; break; } return $condition; }
修改后,只有当传入的参数是**字符串类型的'equals'或'notequals'**时才会匹配对应分支,传入0、true或其他类型的值都会走default返回'like'。
内容的提问来源于stack exchange,提问作者Amit Bisht
相关产品推荐
相关产品推荐

