PHP Switch语句:这是正确的吗?

时间:2011-02-22 18:08:25

标签: php syntax

我已经看过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 [数组,其计算结果为真]进行比较并给出不正确的结果。

我的问题是......为什么这实际上有效?

编辑:抱歉,我没有正确地复制它,因为我一直在搞乱它。它现在处于工作状态

3 个答案:

答案 0 :(得分:1)

如果x是数组,则

is_int($x)不会计算为true。这是有效的,因为array('one', 'two')被认为是真的,而is_array()将被评估为真。这意味着它与nullis_int($x)不匹配(后者出错)。如果它是一个int,则反之亦然,is_array($x)变为false。如果$xnull,则评估为false,交换机中的null也是如此。 null案例将针对$x为假的任何情况执行(使用falsearray()0及其他情况进行审核。

答案 1 :(得分:0)

此行为依赖于真值和假值:

$var = array(1, 2, 3);

// equivalent with if($var){
if($var == true){
  echo 'this will execute';
}

0array()等值是虚假值,1"test"array(1, 2)是真实的。

如果要比较类型,则应使用===,但在switch语句中这是不可能的。

答案 2 :(得分:0)

语法正确,但代码没有按照您的想法执行。

如果你有一个表达式作为开关案例

 case is_array($othervar):

然后该表达式将(1)不考虑实际的开关变量,并且(2)在开关运行之前进行评估。从本质上讲,case将成为

 case TRUE:

然后将这个值与switch ($x)进行比较,这就是为什么它可能在你的例子中意外起作用。