PHP开关 - 如果变量未设置,则默认为默认值

4

有没有办法简化这段代码,避免需要if跳过switch的默认值?

我有一个配置表用于不同的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;
}

我的功能没有问题,但我希望有一种更简洁的方法来切换一个可选变量,请问有什么方法可以实现吗?谢谢!


请注意,您不需要将其设置为“默认值” - 您可以将该代码放入一个函数中,并使用语法 function funcName($type = ""),如果传递了空值,则会将其设置为“”。 - andrewb
@andrewb,你发现了一个有趣的问题。在代码中,如果值未设置,则将其设置为字面字符串“default”,然后执行switch语句时会落入“default”情况,这几乎有点误导人。default:是PHP语法中未匹配的switch case。你可以将$type设置为空字符串或“barbecuebits”。 - Billy left SE for Codidact
是的,那就是问题所在。我只需要将$type设置为某个值,因为如果它没有被设置,我会遇到错误。直到今天,我仍然不确定是否有更好的解决方案。 - kachnitel
4个回答

4

在使用switch语句时,无需将变量设置为"default"。当变量未设置或与所有其他已定义情况的值不同,则会执行default情况。但请记住:如果变量未设置并且您在switch中使用它,您将收到一个通知"Notice:Undefined variable"。因此,如果您不想禁用通知,则必须检查变量是否已设置。


我忘了提到我需要避免收到通知,所以似乎没有其他办法可以避免它,除非加入额外的代码,谢谢。 - kachnitel
虽然这样做可能会被人不赞成,但你可以在变量前面加上 @ 来抑制 Notice。 - musicin3d
@musicin3d 这不是一个好的做法。你不应该使用@符号来抑制错误等。 https://stackoverflow.com/questions/5573426/is-this-bad-practice-use-of-the-error-suppression-operator - edditor
1
我知道压制错误是不好的做法,通常压制任何东西都是不好的。但这只是一个类似于linter警告的提示,关于我们已经处理过的某些内容(使用default:)。在我看来,switch(@ $var){...}比将整个块包装在if(isset($var)){...}中要可读得多。我的意思是,在这种情况下,“变量未设置”提示是@的唯一用途,因此您知道它为什么存在,并且可以减少缩进和混乱。对我来说,这似乎是一个合理的用例。 - musicin3d

4

仅仅

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的情况下,这已经足够了。


1
如果你想简化它而不被注意到,请尝试以下方法:
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;
    }
}

-1

default情况是所有前面的case都不匹配时的“捕获所有”,因此,您对变量是否设置并将其分配给"default"的检查是不必要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接