PHP – Les embranchements conditionnels

Dans les articles précédents, nous avons appris à déclarer des variables – dont les tableaux, utiliser des opérateurs mathématiques, et l’opérateur de concaténation. Aujourd’hui nous allons voir un outil fort pratique en programmation, les embranchements conditionnels. C’est-à-dire qu’une partie du code ne sera exécutée que si la condition d’entrée est vraie.

Les conditions et ses opérateurs

Les embranchements conditionnels sont de la forme « if … else if … else ». En français : « Si … Sinon Si … Sinon ».

Je vais maintenant reprendre l’exemple donné dans la partie Code <> / Général / Définition et algorithmie : « Je souhaites réaliser un programme qui me dit si je suis majeur ou mineur, et qui devra effectuer des actions précises dans les deux cas de figure ».

En premier lieu, nous avons besoin d’une variable « age », définissons la dans un nouveau fichier PHP, à la valeur 25 pour commencer.

Fichier tutophp3/index.php :
<?php

  $age = 25;

?>

Voila qui est fait. Maintenant, j’aimerais effectuer une action lorsque je suis majeur, et une autre si je suis mineur. Définissons ces actions : on va simplement afficher, pour le moment, les chaines suivantes : « Vous êtes majeur! » et « Vous êtes mineur! ».

Fichier index.php, suite :
<?php

  $age = 25;

  if($age >= 18)
  {
    echo 'Vous êtes majeur!';
  }
  else
  {
    echo 'Vous êtes mineur!';
  }

?>

Pour le moment, le code n’affichera que la chaine « Vous êtes majeur! ». Changez la variable « age » à 15 par exemple, et il sera alors affiché « Vous êtes mineur! ». Notez que j’ai utilisé des accolades ouvrantes et fermantes. Celles-ci déclarent un bloc d’instructions. Elle sont complètement optionnelles si nous n’avons qu’une seule instruction. Comme c’est notre cas, nous allons modifier le fichier de sorte à le simplifier, en profiter pour transformer la variable « age » par de l’aléatoire (via la fonction PHP rand()), et nous en profiterons également pour afficher l’âge que le script aura choisi pour nous.

Fichier index.php, v2 :
<?php

  $age = rand(1, 30);

  echo 'Age choisi: ', $age, '<br>';

  if($age >= 18)
    echo 'Vous êtes majeur!';
  else
    echo 'Vous êtes mineur!';

?>

Allez-y, exécutez ce code à plusieurs reprises, et vous verrez qu’un choix a été fait entre l’action « mineur » et l’action « majeur ». Nous avons donc légèrement simplifié le script, et PHP nous choisi un nombre au hasard entre dans la fourchette [1 ; 30] (donc 1 et 30 inclus).

Il existe une autre façon d’écrire des conditions en PHP. La voici ci-après.

Fichier index.php, v3 :
<?php

  $age = rand(1, 30);

  echo 'Age choisi: ', $age, '<br>';

  if($age >= 18):
    echo 'Vous êtes majeur!';
  else:
    echo 'Vous êtes mineur!';
  endif;

?>

Notez que sous cette forme, on a ajouté un double-points (« : ») à la fin début de chaque embranchement conditionnel (juste après la condition), mais aussi la présence de « endif; » pour terminer l’embranchement conditionnel. Pourquoi la présence de ce « endif; » ? Simplement parce que sous cette forme, les accolades sont strictement inutiles –  vous pouvez donc exécuter plusieurs instructions à la suite. Vous pouvez toutefois en rajouter si vous le souhaitez.

Modifions un peu le code maintenant pour détecter un adolescent. Il n’y a pas vraiment d’âge pour laquelle cette période commence, cependant nous allons la fixer à 12.

Fichier index.php, v4a :
<?php

  $age = rand(1, 30);

  echo 'Age choisi: ', $age, '<br>';

  if($age >= 18)
    echo 'Vous êtes majeur!';
  elseif($age >= 12)
    echo 'Vous êtes adolescent!';
  else
    echo 'Vous êtes mineur!';

?>
Fichier index.php, v4b :
<?php

  $age = rand(1, 30);

  echo 'Age choisi: ', $age, '<br>';

  if($age >= 18):
    echo 'Vous êtes majeur!';
  elseif($age >= 12):
    echo 'Vous êtes adolescent!';
  else:
    echo 'Vous êtes mineur!';
  endif;

?>

Nous avons introduit le mot-clé « elseif ». Attention: dans sa seconde forme il doit obligatoirement être en un seul mot (lors de l’utilisation du double-point), cependant, sous sa première forme (celle avec les accolades), « elseif » peut être écrit « else if » (donc avec un espace, en deux mots). La différence étant subtile, notez-le bien dans votre tête ou mettez cette page dans vos favoris. Vous pouvez aussi consulter la page officielle ici : http://php.net/manual/fr/control-structures.elseif.php. Notez aussi qu’on ne peut pas mélanger ces deux écritures entre elle, lorsqu’elles font partie du même bloc conditionnel.

Les opérateurs de comparaison

Nous n’avons vu qu’un seul opérateur de comparaison jusque là : « Supérieur ou Egal à », noté « >= ». Je vais vous lister tous les opérateurs possible :

  • « > » : Supérieur à
  • « < » : Inférieur à
  • « >= » : Supérieur ou Egal à
  • « <= » : Inférieur ou Egal à
  • « == » : Egal à (deux signe « égal » car il est aussi utilisé pour les assignations)
  • « != » : Différent de
  • « === » : Strictement Egal (compare la valeur ET le type des variables)
  • « !== » : Strictement Différent de (compare la valeur ET le type des variables)

Tentons de comprendre à présent les 4 derniers opérateurs cités. Nous allons travailler sur un exemple précis. Prenons un chiffre, au hasard, le 5, et assignons-le d’abord comme un nombre entier, puis ensuite comme une chaine de caractères. Ensuite utilisons nos 4 derniers opérateurs de comparaisons.

Exemple de comparaisons :
<?php

  $varNumber = 5;
  $varString = '5';
  
  if ($varNumber == $varString)
    echo "5 == '5'";
  else if ($varNumber != $varString)
    echo "5 != '5'";

  echo '<br>';
  
  if ($varNumber === $varString)
    echo "5 === '5'";
  else if ($varNumber !== $varString)
    echo "5 !== '5'";

?>
Résultat :
5 == '5'
5 !== '5'

On remarque bien que dans le premier cas, PHP a convertit tout seul un nombre en chaine ou inversement, et a ensuite comparé les valeurs. La chaine de caractères se trouve alors être égale à notre entier. Cependant, dans le second cas de figure, une comparaison sur les types à été effectuée en plus de comparer les valeurs. Les valeurs ont beau être identique, les types des variables sont différent l’une de l’autre. Un conseil de pro, c’est de toujours vérifier les types des variables en plus des valeurs, cela permet d’éviter bien des bogues, et quelques failles de sécurité par-ci par-là. De plus, la comparaison typée est plus rapide a exécuter que son homologue non typée, du fait qu’il n’y a pas l’opération de conversion entre temps. Bref, question optimisations, c’est un point supplémentaire en faveur de la comparaison typée.

Les opérateurs logiques

Outre les opérateurs de comparaisons, il existe aussi les opérateurs logiques. Ceux-ci nous permettent d’effectuer plusieurs conditions en une seule.

Voici ces opérateurs :

  • « && » ou « and » : ET
  • « || » ou « or » : OU
  • « xor » : OU Exclusif
  • « ! » : NON
« && »

Ce cas permet de valider la condition que si les membres situés à gauche et à droite sont vrais.

« && » Exemple :
<?php

  $nombre1 = rand(-1, 1);
  $nombre2 = rand(-1, 1);

  if ($nombre1 > 0 && $nombre2 > 0)
    echo 'Les deux nombres sont positifs';
  else if ($nombre1 < 0 && $nombre2 < 0)
    echo 'Les deux nombres sont négatifs';
  else if ($nombre1 > 0 && $nombre2 < 0)
    echo 'N1 > 0 et N2 < 0';
  else if ($nombre1 < 0 && $nombre2 > 0)
    echo 'N1 < 0 et N2 > 0';
  else
    echo 'Au moins un nombre est nul';

?>
« || » :

Ce cas valide la condition si au moins un des deux membres est vrai, même si l’autre est faux.

« || » Exemple
<?php

  $nombre1 = rand(-1, 1);
  $nombre2 = rand(-1, 1);

  if ($nombre1 > 0 || $nombre2 > 0)
    echo 'Au moins un des deux nombres est  positif';
  else if ($nombre1 < 0 || $nombre2 < 0)
    echo 'Au moins un des deux nombres est négatif';
  else
    echo 'Les deux nombres sont soit positifs, soit négatifs, soit nuls';

?>
« xor »

Le « xor » est un peu plus compliqué. Il est vrai si un des membres est vrai et l’autre est faux. En revanche, si les deux membres de la condition sont vrais ou que les deux membres sont faux, alors la condition est fausse.

« xor » Exemple :
<?php

  $nombre1 = rand(-1, 1);
  $nombre2 = rand(-1, 1);

  if ($nombre1 > 0 xor $nombre2 > 0)
    echo 'Au moins un des deux nombres est positif et l\'autre est négatif ou nul.';
  else if ($nombre1 < 0 xor $nombre2 < 0)
    echo 'Au moins un des deux nombres est négatif et l\'autre est positif ou nul.';
  else if ($nombre1 > 0 xor $nombre2 < 0)
    echo '(N1 > 0 et N2 >= 0) OU (N1 <= 0 et N2 <= 0)';
  else if ($nombre1 < 0 xor $nombre2 > 0)
    echo '(N1 < 0 et N2 <= 0) OU (N1 >= 0 et N2 > 0)';
  else
    echo 'Un autre cas de figure.';

?>
« ! »

L’opérateur « ! » a pour effet d’inverser le résultat de la condition. Si la condition était vraie, elle devient fausse, et vice-versa.

« ! » Exemple :
<?php

  $nombre = rand(-1, 1);

  if (!($nombre > 0))
    echo 'Le nombre est négatif ou nul';
  else if (!($nombre < 0))
    echo 'Le nombre est positif ou nul';
  else
    echo 'Le nombre est nul';

?>
Le switch

Outre les conditions, il existe une autre façons de programmer un embranchement conditionnel, le « switch …  case ». Apprenons-en un peu plus en regardant un exemple. Imaginons que nous jetons un dé de 6 faces, et que suivant le chiffre tiré, une action doit être effectuée. Par exemple, avancez de 2 cases sur le plateau lorsque vous avez fait un 3, et gagner en puissance d’attaque lorsqu’on a fait un 6. On va faire ça en texte, comme tout bon rôliste se respecte.

Exemple Switch Case :
<?php

  $dice = rand(1, 6);
  
  echo 'Vous avez tiré un ' . $dice . '!<br>';
    
  switch($dice)
  {
    case 1:
      echo 'Vous perdez 1 point en armure.';
      break;
    
    case 2:
      echo 'Vous devez reculer votre personnage d\'1 case.';
      break;
    
    case 3:
      echo 'Vous pouvez avancer votre personnage de 2 cases.';
      break;
    
    case 4:
    case 5:
      echo 'Vous perdez ' . $dice . ' points de santé.';
      break;
    
    case 6:
      echo 'Votre puissance d\'attaque augmente de 5!';
      break;

    default:
      echo 'Jamais appelé';
  }

?>
Alternative d’écriture :
<?php

  $dice = rand(1, 6);
  
  echo 'Vous avez tiré un ' . $dice . '!<br>';
    
  switch($dice):

    case 1:
      echo 'Vous perdez 1 point en armure.';
      break;
    
    case 2:
      echo 'Vous devez reculer votre personnage d\'1 case.';
      break;
    
    case 3:
      echo 'Vous pouvez avancer votre personnage de 2 cases.';
      break;
    
    case 4:
    case 5:
      echo 'Vous perdez ' . $dice . ' points de santé.';
      break;
    
    case 6:
      echo 'Votre puissance d\'attaque augmente de 5!';
      break;

    default:
      echo 'Jamais appelé';

  endswitch;

?>

Comme vous pouvez le constater en testant les codes ci-dessus, qui sont strictement identique, on a pu définir des cas bien précis pour chaque valeur du dé. Pour chaque cas, nous avons le mot clé « case », suivi de la valeur a tester, suivit ensuite d’un double-points (un point-virgule est utilisable à la place du double-points, mais je vous déconseille fortement ce genre d’écriture exotique, sous peine de ne pas vous y retrouver si vous programmez dans plusieurs langages différents). Suivent ensuite une liste d’instructions, et terminées par l’instruction « break » pour « casser » et sortir du branchement conditionnel. Vous remarquerez que j’ai utilisé le cas « 4 » vide, permettant ainsi de passer au cas « 5 » lorsque le cas « 4 » est validé. L’étiquette et mot-clé « default » ne sera ici jamais appelé, car tous les cas du switch ont été pourvu, cependant, sachez qu’il existe pour éviter des bogues entre autres choses. Si je souhaitais augmenter le nombre de faces du dé, il serait alors judicieux de placer un code dans le cas « default », qui pourrait permettre, par exemple, d’effectuer une action par défaut, quelque soit la valeur tirée.

Notez aussi l’utilisation d’accolades obligatoires dans le premier cas, et aucune accolade dans le second. Nous avons ici la même règle que pour les conditions.

Conclusion

Vous savez désormais utiliser des embranchements conditionnels en PHP. Sachez que vous pouvez les imbriquer les un dans les autres, et que l’on peut utiliser plusieurs fois les opérateurs booléens dans une même condition. Utilisez des parenthèses dans des conditions complexes pour agir sur les priorités, comme en mathématiques. Pensez aussi à bien respecter les accolades, et tout devrait bien se passer. Vous avez aussi vu comment utiliser la fonction PHP rand(), qui peut se révéler utile.

Prochain chapitre : les boucles.

Laisser un commentaire