如何处理不同类型的PHP开关?

时间:2011-04-06 07:51:13

标签: php

如何使交换机尊重数据类型(如果/ else,有更好的解决方法吗?)

  • $ value = false; //应该回显假
  • $ value = null; //应该回显null

    
    
    switch ($value) {
        case '0' :
            echo 'zero';
            break;
        case '' :
            echo 'empty';
            break;
        case null :
            echo 'null';
            break;
        case false :
            echo 'false';
            break;
        default :
            echo 'default';
            break;
    }
    
    

    结论

  • 开关/案例的比较松散。
  • 解决方案:使用ifs或if / else

    切换
  • 5 个答案:

    答案 0 :(得分:29)

    switch (true) {
        case $value === '0' :
            echo 'zero';
            break;
        case $value === '' :
            echo 'empty';
            break;
        case $value === null :
            echo 'null';
            break;
        case $value === false :
            echo 'false';
            break;
        default :
            echo 'default';
            break;
    }
    

    我认为,它比if-elseif链更具可读性,如下所示:

    if ($value === '0') {
      echo 'zero';
    } else if ($value === '') {
      echo 'empty';
    } else if ($value === null) {
      echo 'null';
    } else if ($value === false) {
      echo 'false';
    } else {
      echo 'default';
    }
    

    答案 1 :(得分:5)

    我相信你可以尝试if-then以便于使用'==='代替:

    <?php
    $value = 0;
    
    if ($value==="") {
      echo "blank (string)";
    }
    else
    if ($value==="0") {
      echo "zero (string)";
    }
    else
    if ($value===false) {
      echo "false (boolean)";
    }
    else
    if ($value===null) {
      echo "null (object)";
    }
    else
    if ($value===0) {
      echo "zero (number)";
    }
    else {
      echo "other";
    }
    ?>
    

    答案 2 :(得分:2)

    php.net手册中,它是

      

    注意:请注意,开关/案例有loose comparision

    "loose comparison" means that switch won't check the type. 
     switch will only compare values:
    

    <?php 
    if('a string' == 0) echo 'a string is 0' . PHP_EOL;
    if('a string' === 0) echo 'but you will never see this' . PHP_EOL;
    switch(0){
        case 'a string': echo 'a string' . PHP_EOL;
        case 'another string': echo 'another string' . PHP_EOL;
    }
    
    if('a string' == true) echo 'a string is TRUE' . PHP_EOL;
    if('a string' === true) echo 'but you will never see this' . PHP_EOL;
    switch(true){
        case 'a string': echo 'a string' . PHP_EOL;
        case 'another string': echo 'another string' . PHP_EOL;
    }
    ?>
    
    will output:
    a string is 0
    a string
    another string
    a string is TRUE
    a string
    another string
    

    答案 3 :(得分:1)

    请记住,您要求PHP juggle types

    如果您看到PHP type comparison table,您会看到null''null == ''非常等效,即{{1}}。

    答案 4 :(得分:0)

    另一种选择,取决于您想要查看的内容:

    switch($foo ?: strtoupper(gettype($foo))){
        case 'bar':
        case 'bork':
            echo $foo;
            break;
    
        case 'NULL': // $foo === null
            echo 'null';
            break;
    
        case 'INTEGER': // $foo === 0
            echo 'zero';
            break;
    
        case 'ARRAY': // $foo === array()
            echo 'array';
            break;
    
        case 'STRING': // $foo === ''
            echo 'empty';
            break;
    
        case 'BOOLEAN': // $foo === false
            echo 'false';
            break;
    
        default:
            echo $foo;
            break;
    }
    

    根据您的数据,您可以添加下划线以增加清晰度,例如'_NULL',但它不是那么干净的IMO。

    个人而言,我同意接受快速空检查的答案:

    case $foo === null: