切换语句没有中断

Ren*_*gen 8 php switch-statement

为什么switch语句中不包含break的case选项会在没有check的情况下自动转发到下一个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();
}
Run Code Online (Sandbox Code Playgroud)

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

我知道如何解决这个问题(只是在我的情况下"创建"添加默认代码),但我不喜欢经常重复该代码.我的实际问题是:为什么在案例不是"创作者"的情况下继续使用"创作者"案例.

Vic*_*let 19

Fallthrough是一个有意的设计功能,允许代码如下:

switch ($command) {
  case "exit":
  case "quit":
    quit();
    break;
  case "reset":
    stop();
  case "start":
    start();
    break;
}
Run Code Online (Sandbox Code Playgroud)

它的设计使得执行在不同情况下运行.

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;
Run Code Online (Sandbox Code Playgroud)

这里的经验法则是,如果它不依赖于开关,则将其移出开关.