类型为string>的PHP 0然后类型字符串0等于true?

时间:2013-07-11 08:23:27

标签: php type-conversion switch-statement

你好,我有以下代码,令我困惑。这是怎么回事?

<?php 

  $concept = '0';

    switch ($concept) {

        case ($concept > '0'):
            $score  = 'Y';
            break;

    } 


?>

5 个答案:

答案 0 :(得分:3)

你的开关是$ concept;你的情况是($ concept&gt;'0'),其评估为FALSE,所以你有效地说case FALSE:;将FALSE与开关条件($ concept)进行比较,即'0';松散的类型给出'0'与FALSE的比较,其评估为TRUE;因此,情况得到满足。

我不知道你真正理解switch语句实际上是做什么的;但它不仅仅是if语句的替代

答案 1 :(得分:3)

来自switch文档:

  

注意:   请注意,开关/外壳没有松动比较。

Check the falsy-ness for '0',这很可怕,我知道。您的案例评估为false,正如您在链接的tbl中看到的那样('0' == false) === true

我将您的switch声明更改为:

switch(true)
{
    case ($concept >'0'):
        echo 'Impossible';
    break;
}

此外,正如文档所说:switch是一个循环式结构,执行松散比较。您无法自己选择比较运算符。如果你想针对一系列案例检查$concept的值,你必须写:

switch($concept)
{
   case '0': echo 'a zero string'; break;
   case '1': echo 'a 1 concept'; break;
}

答案 2 :(得分:3)

就像这样。

<?php 

  $concept = '0';  // 1. This is a string

    switch ($concept) { // 3. boolean FALSE is compared to $concept, 
                        //    which forces $concept to be cast to boolean,
                        //    thus the comparison is FALSE == FALSE which equals TRUE

        case ($concept > '0'):  // 2. ($concept > '0') evaluates to boolean FALSE
            $score  = 'Y';
            break;

    } 

请注意我在评论中添加的数字,以显示评估事物的顺序。 (非常简单)。

你可以做些什么来避免类型问题是这样的:

<?php 

  $concept = '0';

    switch (TRUE) {

        case ($concept > '0'):
            $score  = 'Y';
            break;

    }

这样做是将所有案例条件与TRUE进行比较,并且更像您期望的那样工作。请注意,switch的这种用法有点不同寻常,但可以避免PHP中的某些类型转换问题。

答案 3 :(得分:2)

它将$ concept与$ concept&gt;的结果进行比较'0'

$concept = '0' // '0' == false
$concept > '0' // '0'>'0' == false

你的statemant等于:

switch (false){
  case (false):
    $score  = 'Y';
    break;
}

答案 4 :(得分:1)

您的情况是匹配的,因为false==false这是如何发生的首先采用您的切换条件$concept,初始值为字符串“0”。

然后让你的case语句$concept > 0这个表达式求值为false并在switch块执行之前进行求值,因为switch语句将块值与调用值匹配。

然后在进行匹配时,$concept value =“0”正在转换为布尔值false

所以false==false