If vs switch

De Typo3 CMS / Documentation Typo3 / Support Typo3.

un if est très utile pour faire du si/sinon, mais des qu'on a plus de 3 possibilité le switch est souvent plus lisible et plus facile a étendre/modifié ultérieurement

Mais dans bien des cas on se dit qu'on est obligé d'utiliser un if compte tenu de la nature du choix a faire et pourtant il est simple de passer d'un if à un switch


exemple si l'on demande de faire une action sur une variable en fonction du type de celle-ci tous le monde pense tout de suite a un if

prenons une variable : $myVar de type inconnu que l'on veux traité.

methode classic :

if(is_array($myVar)) 
  {
    traitement_array($myVar);
  }elseif(is_object($myVar)) 
  {
    traitement_object($myVar);
  }elseif(is_numeric($myVar)) 
  {
    traitement_numeric($myVar);
  }
  elseif(is_string($myVar)) 
  {
    traitement_string($myVar);
  }elseif(is_ressource($myVar)) 
  {
    traitement_ressource($myVar);
  }
  elseif(is_integer($myVar)) 
  {
    traitement_numeric($myVar);
  }
  elseif(is_float($myVar)) 
 {
   traitement_numeric($myVar);
  }else 
  {
    throw new Exception('type inconnu pas de traitement disponible');
  }

mais il est tout a fait possible de faire la même chose avec un switch()

switch(true) :
   case is_array($myVar) : 
     traitement_array($myVar);
     break;
   case is_object($myVar) : 
     traitement_object($myVar);
     break;
   case is_numeric($myVar) : 
   case is_float($myVar) : 
   case is_integer($myVar) : 
     traitement_numeric($myVar);
     break;
   case is_string($myVar) : 
     traitement_string($myVar);
     break;
   case is_ressource($myVar) : 
     traitement_ressource($myVar);
     break;  
   default:
     throw new Exception('type inconnu pas de traitement disponible');
  endswitch

il me semble plus clair et plus simple de rajouter un éléement au switch que dans la chaine de if on vois aussi facilement les cas ou le traitement est identique.

autre exemple simple on veux traiter une personne selon sa tranche d'age

$age = age d'une personne entier > 0

avec un if on ferait

if($age < 12 ) {
     traitement_enfant();
  }elseif(($age >= 12) && ($age <= 25)){
     traitement_etudiant();
  }elseif(($age > 25) && ($age <= 59)){
     traitment_adulte();
 
  }elseif($age > 59) {
     traitment_senior();
  }

de la même maniere on peut faire ceci avec un switch non pas avec des case 1,2,3,4,5 etc qui serai horrible mais avec encore un switch(true)

switch(true) :
    case ($age < 12 ): 
      traitement_enfant();
      break;
    case (($age >= 12) && ($age <= 25)): 
      traitement_etudiant();
      break;
    case (($age > 25) && ($age <= 59)): 
      traitment_adulte();
      break;
    case ($age > 59): 
      traitment_senior();
      break;
    default:
     throw new Exception('unreacheable case');
  endswitch;

pour transformer simplement une suite de if par un switch il suffit de faire un switch(true) et de mettre la condition du if dans la valeur du case.

sur une itération de 100 000 switch et 100 000 if , la différence entre les deux est minime 0,26sec pour le if et 0.29sec pour le switch, donc au niveau performance les deux sont très peu différents.

Outils personnels