【问题标题】:PHP 0 of type string > then 0 of type string equals true?字符串类型的 PHP 0 > 那么字符串类型的 0 等于 true?
【发布时间】:2013-07-09 10:28:12
【问题描述】:

您好,我有以下代码,这让我很困惑。这个案子的效果如何?

<?php 

  $concept = '0';

    switch ($concept) {

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

    } 


?>

【问题讨论】:

    标签: php type-conversion switch-statement


    【解决方案1】:

    它是这样工作的。

    <?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;
    
        } 
    

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

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

    <?php 
    
      $concept = '0';
    
        switch (TRUE) {
    
            case ($concept > '0'):
                $score  = 'Y';
                break;
    
        }
    

    它的作用是将所有的 case 条件与 TRUE 进行比较,并且工作起来更像你所期望的。请注意,这种 switch 的用法有点不合常规,但可以避免 PHP 中的一些类型转换问题。

    【讨论】:

      【解决方案2】:

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

      然后让我们使用 $concept &gt; 0 的 case 语句,此表达式的计算结果为 false,并在 switch 块执行之前进行评估,因为 switch 语句将块值与调用值匹配。

      然后在进行匹配时,您的 $concept value = "0" 将被转换为布尔值 false

      所以false==false

      【讨论】:

      • 他得到的是true而不是false
      • @HamZa 这次我写得更好
      【解决方案3】:

      来自switch 文档:

      注意: 请注意,switch/case 确实比较松散。

      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;
      }
      

      【讨论】:

        【解决方案4】:

        比较 $concept 和 $concept > '0' 的结果

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

        你的声明等于:

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

        【讨论】:

          【解决方案5】:

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

          我不认为你真的了解 switch 语句的实际作用;但它不仅仅是 if 语句的替代方法

          【讨论】:

          • 那么替代方案是使用 if 语句?
          • 在这种情况下,if 语句会简单很多,代码的逻辑可读性也会更好
          • 感谢马克的回答,我已经投了赞成票,但我选择了另一个答案,因为它是我需要的。对不起。
          猜你喜欢
          • 1970-01-01
          • 2011-05-03
          • 2011-10-14
          • 2019-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-07
          • 2013-09-22
          相关资源
          最近更新 更多