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

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

$value = false;//должен эхо-ложь $value = 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

Ответ 1

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

Ответ 2

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

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

Ответ 3

в php.net это

Примечание. Обратите внимание, что переключатель /case делает свободное сравнение.

"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

Ответ 5

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

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: