PHP Changer de surprise


Exemple

Les instructions de commutation utilisent une comparaison non stricte pour déterminer les correspondances. Cela peut entraîner de mauvaises surprises . Par exemple, considérez l'instruction suivante:

switch ($name) {
    case 'input 1':
        $mode = 'output_1';
        break;
    case 'input 2':
        $mode = 'output_2';
        break;
    default:
        $mode = 'unknown';
        break;
}

Ceci est une instruction très simple et fonctionne comme prévu lorsque $name est une chaîne, mais peut provoquer des problèmes sinon. Par exemple, si $name est un entier 0 , la jonglerie se produira pendant la comparaison. Cependant, c'est la valeur littérale dans l'instruction case qui est jonglée, pas la condition dans l'instruction switch. La chaîne "input 1" est convertie en entier 0 qui correspond à la valeur d'entrée de l'entier 0 . Le résultat de ceci est que si vous fournissez une valeur de 0 , le premier cas est toujours exécuté.

Il y a quelques solutions à ce problème:

Coulée explicite

La valeur peut être transtypée en chaîne avant la comparaison:

switch ((string)$name) {
...
}

Ou une fonction connue pour renvoyer une chaîne peut également être utilisée:

switch (strval($name)) {
...
}

Ces deux méthodes garantissent que la valeur est du même type que la valeur dans les instructions de case .

Eviter l' switch

L'utilisation d'une instruction if nous permettra de contrôler la manière dont la comparaison est effectuée, ce qui nous permet d'utiliser des opérateurs de comparaison stricts :

if ($name === "input 1") {
    $mode = "output_1";
} elseif ($name === "input 2") {
    $mode = "output_2";
} else {
    $mode = "unknown";
}