83 votes

make switch use === comparaison not == comparaison En PHP

Existe-t-il un moyen de faire en sorte que le code suivant utilise toujours un commutateur et retourne b no a ? Merci !

$var = 0;
switch($var) {
    case NULL : return 'a'; break;
    default : return 'b'; break;
}

En utilisant les instructions "si", bien sûr, vous le feriez comme ceci :

$var = 0;
if($var === NULL) return 'a';
else return 'b';

Mais pour des exemples plus complexes, cela devient verbeux.

60voto

Peter Ajtai Points 26377

Désolé, vous ne pouvez pas utiliser un === dans une déclaration de commutation, puisque selon la norme documentation sur switch() :

Notez que l'interrupteur/le boîtier perd la comparaison.

Cela signifie que vous devrez trouver une solution de rechange. Sur le tableau des comparaisons libres vous pouvez utiliser le fait que NULL == "0" est fausse par le biais d'un moulage de type :

<?php
$var = 0;
switch((string)$var) 
{
    case "" : echo 'a'; break; // This tests for NULL or empty string   
    default : echo 'b'; break; // Everything else, including zero
}
// Output: 'b'
?>

Démonstration en direct

1 votes

Eh bien, il y a d'autres circonstances (pas seulement avec les NULLs) avec lesquelles j'aimerais que cela fonctionne.

37voto

Greg W Points 3036

Une façon de procéder est de faire ce que j'appelle un "backward switch" (il existe peut-être un nom plus officiel pour cela). L'idée est que vous mettez true o false en haut, puis vos conditionnels dans la section case déclarations.

switch(true)
{
  case ($var === NULL):
    return 'a';
    break;
  case ($var === 0):
    return 'b';
    break;
  default:
    return 'c';
}

10voto

Adam Wright Points 31715

Pas avec switch - il ne fait que des comparaisons dites "libres". Vous pouvez toujours le remplacer par un if/else if en utilisant === .

0 votes

Faites-vous référence à votre expérience ou à la documentation ? Si c'est le cas, veuillez poster un lien

1 votes

En fait, vous puede faire cela avec switch (voir ma réponse) bien que je pense que if-else est meilleur pour ce travail particulier.

0 votes

Beaucoup de bonnes réponses, désolé, je ne peux en choisir qu'une. J'ai choisi if/elseif, merci à tous.

3voto

Matt Esch Points 7513

On peut supposer que vous activez la variable et que vous attendez des nombres entiers. Pourquoi ne pas simplement vérifier au préalable le statut d'entier de la variable en utilisant is_int($val) ?

2voto

DaveRandom Points 45661

Vous pouvez le faire :

<?php

  $myVar = 1;

  switch (TRUE) {
    case $myVar === 1.0:
      echo "It's a float!";
      break;
    case $myVar === 1:
      echo "It's an int!";
      break;
  }

Bien que lorsque vous commencez à faire des choses comme ça, il peut être moins déroutant pour le déroulement du programme de le remplacer par un if-else .

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