【问题标题】:PHP fugly bug on case switch statement - PHP version 7.0.13 [duplicate]案例切换语句上的PHP fugly bug - PHP 7.0.13版[重复]
【发布时间】:2018-04-17 06:03:05
【问题描述】:

如果 $value 大于 0,一切正常,但如果 $value 设置为 0,则 case switch 打印 Billion :-)。

由于手册没有说明不评估值 0,所以这对我来说是一个丑陋的错误。 http://php.net/manual/en/control-structures.switch.php

$value = 0;

    switch ($value) {
    case $value >= 1000000000:
      print 'Billion'; 
      break;
    case $value >= 1000000:
      print 'Million';
      break;
    case $value >= 1000 :
      print 'Thousand';
      break;
    default:
          print 'Ten';
      break;            
    }      

.

Output: Billion  :-)

【问题讨论】:

    标签: php


    【解决方案1】:

    这是因为 switch case 不接受可以计算的表达式。您应该为此使用if else。例如开关盒:

    $value = 2;
    switch($value) {
        case 2:
            print "two";
        break;
        default:
            print "default";
    }
    

    例如if else:

    $value = 3;
    if( $value > 2 ) {
        print "greater than 2";
    } elseif($value > 1) {
        print "greater than 1";
    } else {
        print "default";
    }
    

    【讨论】:

    • 我喜欢很多开发人员在没有正确阅读手册并且使用错误的语言功能时直接说“这是一个语言错误”:-)
    • 你只快了 4 分钟。 +1 指出。
    • 如果 $value 设置为 1 那么它可以工作,所以很明显它确实需要一个表达式并对其进行评估。
    • 五票赞成什么?你让你的朋友投票了吗?
    • @Jimski switch case 不是为此目的而设计的。但是,您可以使用建议的解决方法。
    【解决方案2】:
    $value = 0;
    
        switch (true) {
        case ($value >= 1000000000):
          print 'Billion'; 
          break;
        case ($value >= 1000000):
          print 'Million';
          break;
        case ($value >= 1000) :
          print 'Thousand';
          break;
        default:
              print 'Ten';
          break;            
        }  
    

    请参考这个答案https://stackoverflow.com/a/7801218/6186468

    【讨论】:

    • 这会起作用,但您实际上应该将此问题标记为重复,而不是重复答案。
    • 我称之为解决方法。
    • 它有效,因此我将其标记为已接受的答案。但是如果不是完全不合逻辑的话,PHP case switch 实现是反直觉的。
    • 是的,我知道这不是编码的方式,但我只是分享如何使用 switch case 解决它
    【解决方案3】:

    switch 语句对案例中的值执行相等测试。 PHP 正在评估您的比较,因此 $value = 0 变为 case false。 false 被认为是equal to 0,所以第一种情况匹配。

    $value = 0;
    
    switch (true) {
    case ($value >= 1000000000):
      print 'Billion'; 
      break;
    case ($value >= 1000000):
      print 'Million';
      break;
    case ($value >= 1000) :
      print 'Thousand';
      break;
    default:
          print 'Ten';
      break;            
    }  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多