Как обращаться с PHP-переключателем с разными типами?

Как я могу заставить коммутатор уважать типы данных (есть ли временное решение лучше, если / else)?

  • $ value = false; // должен эхо-ложь
  • $ value = null; // должен эхо-нуль
  • 
    
     switch ($ value) {
         case '0':
             echo 'zero';
             ломать;
         дело '' :
             echo 'empty';
             ломать;
         case null:
             echo 'null';
             ломать;
         case false:
             echo 'false';
             ломать;
         по умолчанию :
             echo 'default';
             ломать;
     }
    
    

    Вывод

  • Переключатель / корпус ослабляет сравнение.
  • Решения: переключение с ifs или if / else
  • 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 -chain, как показано ниже:

     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'; } 

    я считаю, что вы можете попробовать, если-то, чтобы облегчить использование '===' вместо этого:

     <?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"; } ?> 

    в руководстве php.net это

    Примечание. Обратите внимание, что переключатель / случай не выполняет сравнения .

     "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 

    Не забывайте, что вы просите PHP манипулировать типами .

    Если вы увидите таблицу сравнения типов PHP, вы увидите, что, например, null и '' эквивалентны, то есть null == '' .

    другой вариант, в зависимости от того, что вам нравится:

     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», но это не так чисто ИМО.

    лично, я согласен с принятым ответом на что-то вроде быстрой проверки нуля:

     case $foo === null: