不包含break的switch语句中的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();
}
如果参数是"创建的",它将在创建的情况下进行检查,这很好。 当检查成功时,我希望代码继续使用默认选项,这就是为什么不中断的原因。 但是相反,它继续到" Creator",而$ param!=" Creator"!
我确实知道如何解决此问题(只需在我的情况下"创建"中添加默认代码),但是我不希望重复该代码太多次。 我的实际问题是:为什么案件不是"创作者",为什么继续处理"创作者"案件。
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;
这里的经验法则是,如果不依赖于开关,请将其移出开关。
我要补充一点-尽管穿透有时是有用的-最好不要在两种情况都做某事而不是仅仅穿透的情况下使用它(良好:case"created": case"creator": case"something_else": do_stuff();不良:case"created": do_stuff(); case"creator": do_Second_stuff(); case"something_else": do_remaining_stuff();)
@dbemerlin:这确实很危险,尽管如果案例简短或使用支持显式失败的语言(例如C#)可以接受,但确实是非常危险的。
最好是添加一条评论以说失败是故意的。
我真的没看到你想要的。
如果要在所有情况下都运行默认内容,只需将其放在开关后面即可。
如果只想在"创建的"情况下运行默认的东西,并且在默认的情况下,请交换"创建的"和"创建者"部分的位置,并在第一部分之后放一个空格。
如果您希望该代码仅在创建者或创建者匹配时才运行,则放弃switch语句,并使用if / else OR使用标志和以下if语句。
所有工具都在那里。
它与我想要的无关,而与为什么switch语句如此工作有关。
抱歉我误解了这个问题。 历史就是答案。 像大多数编程一样,有人这么说。 他们是这样说的。 那里有一些历史(基本上是C启动的),但这就是语法。
也许这会启发您:
跳转表切换案例问题
因为这就是在C语言中完成的方式。
要回答您的"实际问题":为什么在案例不是" Creator"的情况下继续处理" Creator"案例。
因为您没有break。没有它,它将继续进行下面的案例。我能想到的唯一解决方案是将默认代码放入案例中,并添加break。
另外,默认情况下不需要break,因为它是switch块中的最后一种情况。