gpt4 book ai didi

php - 不间断的 switch 语句

转载 作者:可可西里 更新时间:2023-11-01 12:26:17 25 4
gpt4 key购买 nike

为什么不包含 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();
}

如果参数是“created”,它将在 created-case 中进行检查,这很好。当检查成功时,我希望代码继续使用默认选项,这就是为什么没有 break;。但是当 $param != "Creator"!

我确实知道如何解决这个问题(只需在我的案例“创建”中添加默认代码),但我不喜欢过于频繁地重复该代码。我的实际问题是:为什么它继续处理“Creator”案例,而案例不是“Creator”。

最佳答案

Fallthrough 是一个有意的设计特性,允许这样的代码:

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

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

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

  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;

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

关于php - 不间断的 switch 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4155524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com