【问题标题】:Identical match (with type checking) in switch statement PHPswitch 语句 PHP 中的相同匹配(带类型检查)
【发布时间】:2016-01-10 06:02:08
【问题描述】:

刚刚发现一个奇怪的情况,我们只需要在相同匹配(具有精确类型)上运行switch 语句。想想这个场景:

$value = "";

switch ($value) {
    case 0:
        echo "Zero";
        break;

    case 1:
        echo "One";
        break;

    case "":
        echo "Empty";
        break;

    default:
        echo "None";
        break;
}

这将 echo "Zero" 我想要的 echo "Empty"。这是否可以通过switch 语句以某种方式实现,或者我只有将if...elseif...else=== 运算符一起使用?

【问题讨论】:

    标签: php switch-statement equality


    【解决方案1】:

    这样试试

    $value = "";
    
    switch (true) {
        case ($value === 0):
            echo "Zero";
            break;
    
        case ($value === 1):
            echo "One";
            break;
    
        case ($value === ""):
            echo "Empty";
            break;
    }
    

    DEMO

    【讨论】:

    • 不完全是我想要的,但它仍然比使用if...elseif...else 更好地达到目的。如果下一个答案没有找到其他更好的选择,我会接受这个!谢谢。
    • Dhonnobad :) @TareqMahmood
    【解决方案2】:

    PHP 的 switch 语句是documented to use loose comparison。如果您需要完全匹配,那么不幸的是,最好的办法是使用带有 === 的单独 if/else 测试。

    另一种选择类似于

    switch(true) {
        case $value === 0:
            //...
            break;
    }
    

    但这与一系列 if-else 语句大致相同,具有更多的输入和缩进。

    【讨论】:

    • 确实它有更多的缩进和更多的打字,但我认为它比if....elseif...else 语句更干净、更易读!无论如何,感谢您提到“松散比较”,我在检查文档时错过了这一点!
    【解决方案3】:

    可以,你只需要翻转你正在比较的东西:

    switch(true) { 
        case $value === 0:
        echo "Zero";
        break;
    
        case $value === 1:
        echo "One";
        break;
    
        case $value === "":
        echo "Empty";
        break;
    
        default:
        echo "None";
        break;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 2022-08-17
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多