17 votes

Comment gérer une instruction switch PHP avec des types différents ?

Comment puis-je faire en sorte que le switch respecte les types de données (y a-t-il une solution de contournement meilleure que les if/else) ?

  • $value = false; // devrait afficher false

  • $value = null; // devrait afficher null

    switch ($value) {
        case '0' :
            echo 'zéro';
            break;
        case '' :
            echo 'vide';
            break;
        case null :
            echo 'null';
            break;
        case false :
            echo 'false';
            break;
        default :
            echo 'défaut';
            break;
    }

    Conclusion

  • Switch/case effectue une comparaison lâche.

  • Solutions : switch avec des if ou if/else

30voto

KingCrunch Points 45168
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;
}

Je pense que c'est plus lisible qu'une chaîne if-elseif comme celle ci-dessous :

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

5voto

nicola Points 799

Je crois que vous pouvez essayer if-then pour faciliter l'utilisation de '===' au lieu de :

3voto

diEcho Points 22385

Dans le manuel de php.net c'est une

note: Notez que switch/case fait une comparaison lâche.

"comparaison lâche" signifie que switch ne vérifie pas le type. 
 switch comparera uniquement les valeurs:

va produire:
une chaîne est 0
une chaîne
une autre chaîne
une chaîne est VRAI
une chaîne
une autre chaîne

1voto

Jacob Smith Points 79

Une autre option, selon ce que vous aimez regarder:

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

en fonction de vos données, vous pourriez inclure un tiret bas pour plus de clarté, comme '_NULL', mais ce n'est pas aussi propre à mon avis.

personnellement, je suis d'accord avec la réponse acceptée pour quelque chose comme une vérification rapide de null:

case $foo === null:

0voto

Hamish Points 11431

Gardez à l'esprit que vous demandez à PHP de jongler avec les types.

Si vous consultez le tableau de comparaison des types PHP, vous verrez que, par exemple, null et '' sont équivalents de manière lâche, c'est-à-dire null == ''.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X