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)
这里的经验法则是,如果它不依赖于开关,则将其移出开关.