> Tech > PHP, Structures de contrôle conditionnelles

PHP, Structures de contrôle conditionnelles

Tech - Par Renaud ROSSET - Publié le 16 juillet 2012
email

Jusqu'ici, je vous ai présenté brièvement deux structures de contrôle basiques de PHP : if () et foreach (). Dans cet encadré, j'en dis un peu plus sur if () et je présente quelques autres structures logiques conditionnelles.

PHP, Structures de contrôle conditionnelles

Le script de la figure 6 commence par une boucle for () (A), que vous devriez déchiffrer facilement bien qu’elle ne soit pas identique à la version RPG. La première des trois expressions entre parenthèses représente la condition de départ, qui sera évaluée une fois au début de la boucle. RPG fonctionne de la même manière, mais avec une exception importante. En PHP, il est possible d’utiliser la première partie de l’expression pour définir des variables multiples en séparant les expressions individuelles par des virgules (par exemple, for ($x = 0, $y = 1, $z = … ). La seconde expression est la condition « while true », qui, comme avec RPG, peut être omise pour fournir un type de boucle « forever » qui doit être terminée par une instruction break (l’équivalent d’un RPG LEAVE). La troisième partie est l’expression d’itération, généralement utilisée pour incrémenter la variable (++) utilisée dans les expressions antérieures. Comme avec RPG, l’itération s’exécute à la fin de la boucle.

Quelques précisions supplémentaires : premièrement, le type de boucle « forever » en PHP est un peu plus utile qu’en RPG, parce qu’en PHP, vous pouvez omettre l’expression d’itération sans craindre des effets secondaires. Vous pouvez omettre l’expression en RPG, mais le compilateur ajoutera automatiquement du code pour ajouter 1 à la variable de contrôle à chaque passage, avec un risque de débordement numérique. Certes, ce scénario n’est pas très probable, mais …

Deuxièmement, certains d’entre vous ne connaissent pas bien la notation ++  (A en figure 6). $x++ incrémentera $x de la même manière que $x+= 1 (or $x = $x + 1) le ferait en RPG et c’est une structure courante en PHP. Parfois aussi, les symboles ++ apparaîtront avant le nom de la variable (par exemple, ++$x). Plutôt que de compliquer les choses ici, je préfère laisser une discussion sur les ramifications de cette différence se dérouler sur le forum. Mais si vous ne pouvez pas attendre, consultez donc le manuel PHP (php.net/manual/en/language.operators.increment.php).

Dans la boucle for, je démontre la structure switch() de PHP (B en figure 6). C’est semblable à SELECT/WHEN en RPG. La traduction en RPG du code PHP serait la suivante :

Select;
  When ( $x = 1 );
     Dsply ‘Case was 1’;
       …
  Other;
     …
EndSl;

La grande différence est que, dans la version RPG, la clause When peut s’appliquer à toute sorte de comparaison. Dans switch de PHP, la valeur de la variable unique nommée sur le switch lui-même, est testée pour voir si elle est égale à la valeur identifiée sur l’instruction case. Cela me semble plus clair que la version RPG, mais peut-être est-ce un sentiment personnel.

Les RPGistes butent toujours sur un aspect de switch : en PHP, dès lors qu’une valeur case() correspondante a été trouvée et le code associé exécuté, PHP ne saute pas à la fin du groupe comme le ferait RPG, mais continue plutôt à exécuter des instructions jusqu’à la rencontre d’une instruction break. Bien que ce comportement soit parfois utile, il aura souvent un effet nuisible. C’est pourquoi il vaut mieux vous habituer à spécifier break à la fin de chaque groupe case. En B de la figure 6, sans les instructions break en place, si $x a une valeur de 1, les trois instructions echo dans le bloc de switch, s’exécuteront !

Tant que je suis dans la boucle, je vais démontrer une fonction supplémentaire de la structure de PHP dont je n’ai pas parlé dans l’article principal : la construction elseif  (C, figure 6). Cela fonctionne exactement comme elseif de RPG. Si vous regardez de près la logique du groupe if, vous verrez qu’elle reflète exactement le comportement du groupe switch au-dessus (B, figure 6).

La structure if/else nous donne l’occasion de signaler une autre différence entre les deux langages : en RPG, le code est If ($x = 1), mais en PHP le code est If ($x == 1) puisqu’un test d’égalité est représenté par un double signe égal. Cela peut poser quelques problèmes dans vos premiers contacts avec PHP.

Pourquoi ? Parce que si vous oubliez et ne codez qu’un seul signe égal (par exemple, If ($x = 1) ) la syntaxe ainsi obtenue est irréprochable mais ne fera pas ce que vous voulez parce que dans ce cas le test serait toujours vrai ! PHP attribuerait d’abord la valeur 1 à $x, puis testerait si la valeur dans $x donne l’égalité true (vrai). Comme une valeur non zéro est considérée true en PHP, l’expression serait toujours true. Il m’arrive de commettre cette erreur de temps en temps, particulièrement quand je fais la navette entre RPG et PHP.

Vient ensuite la boucle while de PHP (D, figure 6), qui s’associe directement à Do While (DOW) de RPG (la boucle while de PHP crée une boucle testée au début où la condition de contrôle est testée avant d’entrer dans la boucle). Par conséquent, le code dans la boucle risque de ne jamais s’exécuter. Pour vous le prouver à vous-même, essayez d’utiliser une valeur initiale de $w différente.

Comparez cela à la boucle do…while (E, figure 6), qui s’associe à Do Until (DOU) de RPG. Oui, vous avez bien lu. Au début j’ai été un peu perplexe puis j’ai constaté que le code PHP est beaucoup plus facile à lire. J’ai toujours eu du mal à me souvenir laquelle des deux opérations DOx de RPG est la bonne, et je finis toujours par consulter le manuel. Avec PHP il est beaucoup plus évident de voir laquelle est la bonne parce que la phrase while se trouve à la fin du bloc, et donc on se souvient facilement que c’est la version testée à la fin de la boucle.

Un dernier point : les structures de contrôle PHP disposent d’une syntaxe alternée qui, dans certains cas, est un peu plus proche de celle de RPG. C’est pour cette raison que certains RPGistes la préfèrent. L’exemple en C de la figure 6 recodé avec cette syntaxe se présenterait ainsi :      

If ($x == 1):
echo « If == 1 was true<br> »;
elseif ($x == 3):
echo « elseif == 3 was true<br> »;
else:
echo « Final else was true<br> »;
endif; // End of if block.

Observez comment l’accolade d’ouverture ( { ) a été remplacée par un signe deux-points, et l’accolade de fermeture ( } ) pour chaque groupe, purement et simplement supprimée. L’autre différence de cette syntaxe est qu’elle requiert une opération de type endxx comme le montre le endif. À noter que le endif est terminé par un point-virgule et pas par un signe deux-points comme le sont If/elseif/else. Le code résultant est semblable à du RPG et donc plutôt tentant. Cependant, je vous déconseille son usage, car il ne semble pas très répandu dans la communauté PHP.

Je n’ai fait que gratter la surface des opérations conditionnelles de PHP, mais espère avoir couvert la plupart des écueils qui se présenteront aux RPGistes.

Téléchargez cette ressource

Guide de Sécurité IA et IoT

Guide de Sécurité IA et IoT

Compte tenu de l'ampleur des changements que l'IA est susceptible d'entraîner, les organisations doivent élaborer une stratégie pour se préparer à adopter et à sécuriser l'IA. Découvrez dans ce Livre blanc Kaspersky quatre stratégies efficaces pour sécuriser l'IA et l'IoT.

Tech - Par Renaud ROSSET - Publié le 16 juillet 2012