代码之家  ›  专栏  ›  技术社区  ›  Rene Terstegen

无中断切换语句

  •  8
  • Rene Terstegen  · 技术社区  · 14 年前

    为什么switch语句中不包含break的case选项会自动转发到下一个case而不进行检查?

    try {
        switch($param) {
            case "created":
                if(!($value instanceof \DateTime))
                    throw new \Exception("\DateTime expected, ".gettype($value)." given for self::$param");
            case "Creator":
                if(!($value instanceof \Base\User)) {
                    throw new \Exception(get_class($value)." given. \Base\User expected for self::\$Creator");                  
                }
            default:
                $this->$param = $value;
                break;
        }
    } catch(Exception $e) {
        echo $e->getMessage();
    }
    

    如果参数是“创建的”,它将在创建的案例中进行检查,这是很好的。当检查成功时,我希望代码继续使用默认选项,这就是没有中断的原因。但是它继续“创建者”而$param!=“创造者”!

    我知道如何解决这个问题(只需在我的例子“created”中添加默认代码),但我不想经常重复这些代码。我的实际问题是:为什么在案例不是“创建者”的情况下,它会继续“创建者”案例。

    5 回复  |  直到 14 年前
        1
  •  19
  •   Victor Nicollet    14 年前

    Fallthrough是一个故意设计的特性,允许如下代码:

    switch ($command) {
      case "exit":
      case "quit":
        quit();
        break;
      case "reset":
        stop();
      case "start":
        start();
        break;
    }
    

    它的设计是为了让执行从一个案例到另一个案例。

    default 是一个与其他案件一样的案件,但如果没有其他案件被触发就会跳到那里。它决不是“在运行实际选定的案例后执行此操作”指令。在您的示例中,您可以考虑:

      switch($param) {
        case "created":
            if(!($value instanceof \DateTime))
                throw new \Exception("\DateTime expected, ".gettype($value)." given for self::$param");
            break;
        case "Creator":
            if(!($value instanceof \Base\User)) {
                throw new \Exception(get_class($value)." given. \Base\User expected for self::\$Creator");                  
            }
            break;
    }
    
    $this->$param = $value;
    

    这里的经验法则是,如果它不依赖于开关,就把它移出开关。

        2
  •  1
  •   Ignacio Vazquez-Abrams    14 年前

    因为事情就是这样的 in C .

        3
  •  1
  •   Community CDub    7 年前

    也许这会启发你:

    Jump Table Switch Case question

        4
  •  1
  •   caveman    14 年前

    我看不出你想要什么。

    1. 如果你想在所有情况下运行默认的东西,只需把它放在开关之后。
    2. 如果只想在“已创建”和“默认”情况下运行默认内容,请交换“已创建”和“创建者”部分的位置,并在第一个部分之后放置一个分隔符。
    3. 如果只希望在创建者或创建的代码匹配时运行该代码,那么去掉switch语句并使用if/else或使用标志和后面的if语句。

    所有的工具都在那里。

        5
  •  0
  •   Ruel    14 年前

    回答你的“实际问题”: 当案例不是“创建者”时,为什么还要继续“创建者”案例?

    因为你没有 break . 如果没有它,它将继续到下面的情况。我能想到的唯一解决方案是将默认代码放到案例中,然后添加 打破 .

    另外,你不需要 打破 在默认情况下,因为它是开关块中的最后一个情况。