我已经看过php.net上的开关文档,并且我可以告诉它检查交换机中的变量和大小写之间的相等比较。但是,以下代码似乎适用于所有可能的值(int,null,array,other):
$x = array('one','two');
switch ($x) {
case null:
echo "is null!";
break;
case is_int($x):
echo "is int";
break;
case is_array($x):
echo "is array!";
break;
default:
echo "something else!";
break;
}
根据我的阅读,它应该将is_int($ a)[true]与$ x [数组,其计算结果为真]进行比较并给出不正确的结果。
我的问题是......为什么这实际上有效?
编辑:抱歉,我没有正确地复制它,因为我一直在搞乱它。它现在处于工作状态答案 0 :(得分:1)
is_int($x)
不会计算为true。这是有效的,因为array('one', 'two')
被认为是真的,而is_array()
将被评估为真。这意味着它与null
或is_int($x)
不匹配(后者出错)。如果它是一个int,则反之亦然,is_array($x)
变为false。如果$x
为null
,则评估为false
,交换机中的null
也是如此。 null
案例将针对$x
为假的任何情况执行(使用false
,array()
,0
及其他情况进行审核。
答案 1 :(得分:0)
此行为依赖于真值和假值:
$var = array(1, 2, 3);
// equivalent with if($var){
if($var == true){
echo 'this will execute';
}
0
和array()
等值是虚假值,1
,"test"
和array(1, 2)
是真实的。
如果要比较类型,则应使用===
,但在switch语句中这是不可能的。
答案 2 :(得分:0)
语法正确,但代码没有按照您的想法执行。
如果你有一个表达式作为开关案例
case is_array($othervar):
然后该表达式将(1)不考虑实际的开关变量,并且(2)在开关运行之前进行评估。从本质上讲,case
将成为
case TRUE:
然后将这个值与switch ($x)
进行比较,这就是为什么它可能在你的例子中意外起作用。