3

您好,我有以下代码,这让我感到困惑。它是如何打击这个案子的?

<?php 

  $concept = '0';

    switch ($concept) {

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

    } 


?>
4

5 回答 5

3

你的开关在 $concept; 你的情况是 ($concept > '0'),它的评估结果是 FALSE,所以你说的很有效case FALSE:;将该 FALSE 与开关条件 ($concept) 进行比较,即“0”;松散类型将“0”与 FALSE 进行比较,结果为 TRUE;因此案件成立。

我不认为您真正了解 switch 语句的实际作用。但它不仅仅是 if 语句的替代方案

于 2013-07-11T08:29:36.340 回答
3

switch文档:

注意:请注意,开关/案例确实比较松散。

检查 falsy-ness'0',这很糟糕,我知道。false正如您在链接的 tbl 中看到的那样,您的案例评估为and ('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;
}
于 2013-07-11T08:29:47.953 回答
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 中的一些类型转换问题。

于 2013-07-11T08:33:16.990 回答
2

它将 $concept 与 $concept > '0' 的结果进行比较

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

您的声明等于:

switch (false){
  case (false):
    $score  = 'Y';
    break;
}
于 2013-07-11T08:34:31.403 回答
1

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

然后让我们来看看你的 case 语句,$concept > 0这个表达式false在执行 switch 块之前评估和评估,因为 switch 语句将块值与调用值匹配。

然后,当进行匹配时,您的$conceptvalue = "0" 将被转换为 boolean value false

所以false==false

于 2013-07-11T08:29:43.400 回答