我有这段代码:
$r = do_something($data);
if ($r == 1)
{
echo "it is 1";
}
switch ($r)
{
case "a":
print "a";
break;
case "b":
print "b";
break;
default:
print "default";
}
使用此代码,输出应为:
it is 1
default
但令人惊讶的是输出是:
it is 1
a
这怎么可能?
编辑:经过一些测试后我看到了:
$r === true.
所以新的问题是:当var为true时,如何切换工作?
答案 0 :(得分:2)
PHP的"type juggling"规则相当棘手,偶尔也不直观甚至引起争议。有a great big table in the manual显示当您对各种排序进行比较时会发生什么,但要解释您的具体情况:
$r
目前是true
,这是boolean
; if
语句针对1
进行测试,integer
;以及switch
对"a"
和"b"
进行string
语句测试,boolean
s。integer
与integer
进行比较时,PHP首先使用boolean
转换为{{0
的规则将false
转换为true
1}},以及其他任何内容都会转换为$r == 1
。这会影响您true
评估$r == 42
的情况,但true
评估为boolean
。string
与string
进行比较时,会发生类似的事情,但此处string
会根据此规则进行转换:空false
为{{ 1}},其他任何内容都是true
。因此$r == "a"
在您的示例中也会计算为true
,这就是执行switch
语句的分支的原因。要获得您希望的结果,您需要以不同的方式强制进行类型转换。有几种方法可以做到这一点,但最简单的方法是将$r
转换为与您比较它的类型相同的类型:
(int)$r
会为integer
1
提供true
的值,为0
提供false
,所以{{1} }会给出相同的结果,但更清楚的是if ( (int)$r == 1 )
在代码中的那一点上实际上并不是$r
。integer
会为您提供(string)$r
string
,因此"1"
不必进行任何“类型杂耍”来比较{{1}等字符串1}}和switch( (string)$r )
,你不会有任何惊喜。答案 1 :(得分:0)
我认为你的do_something($data)
函数如果按照预期的那样返回1。我尝试了这个代码,它的工作原理。在这里。
function do_something($data){
return 1;
}
$r= do_something('abc');
if ($r == 1)
{
echo "it is 1<br />";
}
switch ($r)
{
case "a" : print "a"; break;
case "b" : print "b"; break;
default : print "default";
}
输出:
it is 1
default