【问题标题】:PHP switch - default if the variable is not setPHP 开关 - 如果未设置变量,则为默认值
【发布时间】:2013-09-23 23:47:10
【问题描述】:

有没有什么办法可以简化这段代码以避免需要 if 来跳转到开关的默认值?

我有一个针对 http 请求的不同身份验证方法的配置表,其中有一个选项可以不将值设置为默认为纯 http 请求:

if(!isset($type)) {
    $type = "default";
}

switch ($type) {
   case "oauth":
       #instantinate an oauth class here
       break;
   case "http":
       #instantinate http auth class here
       break;
   default:
       #do an unprotected http request
       break;
}

我对功能没有问题,但我想要一个更简洁的解决方案来打开可选变量,有什么方法可以实现吗?谢谢!

【问题讨论】:

  • 请注意,您不需要将其设置为“默认” - 您可以将该代码放在一个函数中并使用语法函数 funcName($type = "") 将其设置为 "" 如果ib 传递了一个空值。
  • 有趣的捕获 @andrewb 在代码中几乎有点误导,如果未设置的值设置为文字字符串'default',然后在 switch 中执行落入'default case'。默认值:是不匹配的 switch case 的 php 语法。你也可以将 $type 设置为 "" 或 "barbecuebits"。
  • 是的,这就是问题所在。我只需要将 $type 设置为好像没有设置的东西,我最终会遇到错误。直到今天我还不确定我是否知道更好的解决方案..

标签: php switch-statement isset


【解决方案1】:

您不需要将变量设置为“默认值”。如果变量未设置或与所有其他定义的情况有任何不同的值,则将执行默认情况。 但请记住:如果未设置变量并且您在开关中使用它,您将收到“注意:未定义变量”的通知。因此,如果您不想禁用通知,则必须检查变量是否已设置。

【讨论】:

  • 我没有提到我需要避免收到通知,所以如果没有额外的代码似乎没有办法绕过它,谢谢。
  • 虽然它可能不受欢迎,但您可以通过在变量前面放置 @ 来隐藏通知。
  • @musicin3d 这不是一个好习惯。您不应该使用@ 来抑制错误等。stackoverflow.com/questions/5573426/…
  • 看,我知道抑制错误是不好的做法,而且抑制任何东西通常都是不好的。但这是一个通知,类似于 linter 警告......关于我们已经在处理的事情(default:)。并且 IMO switch(@ $var){...} 比将整个块包装在 if(isset($var)){...} 中更具可读性。我的意思是,在这种情况下,“未设置变量”通知是 @ 的唯一用途,因此您确切地知道它存在的原因并减少了缩进和混乱。这对我来说似乎是一个合法的用例。
【解决方案2】:

只是

switch ($type??'') {
    case "oauth":
        #instantinate an oauth class here
        break;
    case "http":
        #instantinate http auth class here
        break;
    default:
        #do an unprotected http request
        break;    
}

在 php 上就足够了 >= 7

【讨论】:

    【解决方案3】:

    如果您想在不通知的情况下简化它。请尝试以下操作:

    if(!isset($type)) {
        #do an unprotected http request
    }else{
        switch ($type) {
           case "oauth":
               #instantinate an oauth class here
               break;
           case "http":
               #instantinate http auth class here
               break;
        }
    }
    

    【讨论】:

      【解决方案4】:

      default 的情况是一个包罗万象的情况,如果没有找到之前的情况,因此您不需要检查变量是否 isset 并将其分配给 "default"

      【讨论】:

        猜你喜欢
        • 2020-03-19
        • 2013-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-16
        相关资源
        最近更新 更多