无间断的 switch 语句

switch statement without break(无间断的 switch 语句)
本文介绍了无间断的 switch 语句的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

How come a case option in a switch statement that does not contain a break automatically forwards to a next case without check?

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 BaseUser)) {
                throw new Exception(get_class($value)." given. BaseUser expected for self::$Creator");                  
            }
        default:
            $this->$param = $value;
            break;
    }
} catch(Exception $e) {
    echo $e->getMessage();
}

如果参数是创建"的,它将在创建的情况下进行检查,这很好.当检查成功时,我希望代码继续使用默认选项,这就是为什么没有 break;.但相反,它在 $param != "Creator"! 时继续创建者"!

If the param is "created" it will do the check in the created-case, which is good. When the check is succesful, I want the code to continue to the default option, that's why there is no break;. But instead it continues to "Creator" while $param != "Creator"!

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

I do know how to solve this (just add the default code in my case "created"), but I don't like to repeat that code too often. My actual question is: Why does it continue with the "Creator" case while the case is not "Creator".

推荐答案

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

Fallthrough was an intentional design feature for allowing code like:

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

它的设计是为了逐个执行执行.

It's designed so that execution runs down from case to case.

default 与任何其他情况一样,只是在没有触发其他情况时会跳转到那里.这绝不是在运行实际选定的案例后执行此操作"指令.在您的示例中,您可以考虑:

default is a case like any other, except that jumping there happens if no other case was triggered. It is not by any means a "do this after running the actual selected case" instruction. In your example, you could consider:

  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 BaseUser)) {
            throw new Exception(get_class($value)." given. BaseUser expected for self::$Creator");                  
        }
        break;
}

$this->$param = $value;

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

The rule of thumb here is, if it doesn't depend on the switch, move it out of the switch.

这篇关于无间断的 switch 语句的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Convert JSON integers and floats to strings(将JSON整数和浮点数转换为字符串)
in php how do I use preg replace to turn a url into a tinyurl(在php中,如何使用preg替换将URL转换为TinyURL)
all day appointment for ics calendar file wont work(ICS日历文件的全天约会不起作用)
trim function is giving unexpected values php(Trim函数提供了意外的值php)
Basic PDO connection to MySQL(到MySQL的基本PDO连接)
PHP number_format returns 1.00(Php number_Format返回1.00)