428 Chapitre 11. Récapitulatif PHP Tableau 11.1 — Opérateurs arithmétiques Opérateur Description $a+$b Addition de $a et $b $a-$b Soustraction de $b à $a $a*$b Multiplication de $a et $b $a/$b Division de $a par $b $a%$b $a modulo $b (reste de la division de $a par $b) 11.4.1 Concaténation de chaînes Un opérateur très fréquemment utilisé est la concaténation de chaînes, simplement représentée par le point « . ». $c1 = "Bonjour "’; $c2 = "Dominique"; // Affichage de la cha^ıne "Bonjour cher Dominique" echo $c1 . " cher " . $c2; Nous avons déjà discuté de l’opérateur d’affectation ’=’, qu’il ne faut surtout pas utiliser pour effectuer des tests d’égalité ! Il est couramment utilisé pour stocker dans une variable le résultat d’un calcul. $i=4+3; $c = "Bonjour cher"; $i=$i+2; $c = $c . " Dominique" Les deux dernières formes sont très courantes : elles utilisent une variable à la fois comme opérande (dans la partie droite de l’affectation) et pour stocker le résultat (dans la partie gauche de l’affectation). Il existe une syntaxe permettant d’exprimer de manière plus économique ce type d’opération. $i += 2; $c .= " Dominique" Cette notation évite d’avoir à répéter le nom de la variable. Elle peut être utilisée avec tous les opérateurs arithmétiques et l’opérateur de concaténation. 11.4.2 Incrémentations Une autre technique très couramment utilisée est l’incrémentation d’un compteur, dans une boucle par exemple. L’écriture normale est $i=$i+1.PHPreprenddu C une syntaxe plus compacte : l’expression $i++ est équivalente à la précédente et incrémente de 1 la valeur de $i. Comme toute expression, $i++ a une valeur, en l’occurrence la valeur de $i avant son incrémentation. Pour obtenir la valeur $i après son incrémentation, on utilise 11.4 Opérateurs 429 ++$i. Les mêmes expressions existent avec l’opérateur de soustraction. Ces subtilités du langage sont liées à la volonté de faire de PHP un langage où tout (presque tout) est expression, c’est-à-dire a une valeur. On peut tout à fait s’épargner l’utilisation de ce genre de technique si on trouve qu’elles ne favorisent pas la qualité du code. Voici quelques exemples résumant ces opérateurs unaires. $i=4;//$ivaut 4 $i++; / $i vaut 5 $j = ++$i; // $j vaut 6, $i vaut 6 $k = $i++; // $k vaut 6, $i vaut 7 $k ; // $k vaut 5 11.4.3 Opérateurs de bits La table 11.2 donne la liste des opérateurs de bits. Il agissent sur des entiers et permettent de manipuler la représentation binaire. En déplaçant tous les bits d’un cran vers la gauche par exemple, on obtient le double de sa valeur. Tableau 11.2 — Opérateurs de bits Opérateur Description $a&$b ET binaire. Renvoie un entier dont les bits à 1 sont ceux à 1 dans $a ET dans $b. $a|$b OU binaire. Renvoie un entier dont les bits à 1 sont ceux à 1 dans $a OU dans $b. $a^$b OU EXCLUSIF binaire. Renvoie un entier dont les bits à 1 sont ceux à 1 dans $a OU dans $b, mais pas dans les deux. ˜ $a Renvoie un entier dont les bits sont inversés par rapport à ceux de la variable $a. $a << $b Décale les bits de $a de $b positionsverslagauche. $a >> $b Décale les bits de $a de $b positionsversladroite. 11.4.4 Opérateurs logiques Les opérateurs logiques sont donnés dans la table 11.3. Rappelons qu’une valeur est interprétée comme vraie si elle est différente de 0 ou de la chaîne vide, et fausse sinon. Tableau 11.3 — Opérateurs logiques Opérateur Description $a && $b (ET) Renvoie vrai si $a ET $b sont vrais. $a and $b Idem que &&. $a || $b (OU) Renvoie vrai si $a OU $b est vrai. $a or $b Idem que ||. $a xor $b Ou exclusif : $a OU $b est vrai, mais pas les deux. !$a (NOT). Renvoie la négation de $a. 430 Chapitre 11. Récapitulatif PHP Enfin la table 11.4 donne la liste des opérateurs de comparaison de PHP. Il est très important de noter, si vous n’êtes pas familier du langage C ou de ses dérivés (C++, Java) que le test d’égalité s’écrit avec deux ’=’. Une erreur très courante est d’oublier un ’=’ dans un test d’égalité. L’interpréteur ne signale rien puisque l’opérateur d’affectation renvoie une valeur qui peut être interprétée comme un booléen. $i=1; $j=2; if ($i == $j) // Renvoie FALSE: i est diff´erent de j. if ($i = $j) // Renvoie TRUE ! Dans l’exemple ci-dessus, le deuxième test utilise (par erreur) l’affectation ’=’ et non la comparaison ’==’. Dans ce cas la valeur $j est affectée à $i, et la valeur de cette affectation est elle-même la valeur de $j, soit 2, interprétée comme TRUE.Non seulement le test ne donne pas le résultat attendu, mais la valeur de $i a été modifiée. Ce genre d’erreur est difficile à détecter, et fait partie des faiblesses de la syntaxe du C qui a été reprise dans PHP. Tableau 11.4 — Opérateurs de comparaison Opérateur Description $a == $b Vrai si $a est égal à $b. $a != $b Vrai si $a est différent de $b. $a < $b Vrai si $a est inférieur à $b. $a > $b Vrai si $a est supérieur à $b. $a <= $b Vrai si $a est inférieur ou égal à $b. $a >= $b Vrai si $a est supérieur ou égal à $b. 11.5 STRUCTURES DE CONTRÔLE Les structures de contrôles sont les tests et les boucles. Elles permettent de spécifier, en fonction de l’état d’un script à l’exécution (déterminé par la valeur de certaines variables), quelles sont les parties du script à effectuer (structures de tests), ou combien de fois on doit les effectuer (structures de boucle). L’unité de base pour décrire les actions d’un script est l’instruction, qui est typi- quement l’affectation d’une valeur à une variable, ou toute autre expression plus complexe. Les instructions sont séparées par des points virgules. On place le contrôle sur des blocs. Un bloc est une suite d’instructions, exécutées en séquence et solidai- rement, et encadrées par ’{’ et ’}’. Là encore cette syntaxe est reprise du C. 11.5 Structures de contrôle 431 11.5.1 Tests La structure la plus courante est le if else. Voici la syntaxe. if (expression ) { // Bloc si expression est vraie. } else { // Bloc si expression est fausse. } // Ici le script continue. Le else, et son bloc associé, est optionnel. De même, si le bloc du if contient une seule instruction, on peut se passer des accolades. expression est en général un test de comparaison, éventuellement plusieurs avec des opérateurs logiques. Comme nous l’avons vu, on peut utiliser n’importe quelle expression, y compris des appels de fonction, puisque toute valeur peut être interprétée comme vrai ou faux. Les instructions if peuvent être imbriquées (un if dans un autre if) et cumulées (plusieurs if consécutifs), comme le montre l’exemple ci-dessous. Il n’y a pas de limite à la profondeur d’imbrication des if, si ce n’est le manque de lisibilité qui en découle. Une bonne règle est de ne pas s’autoriser plus de deux niveaux d’imbrications. Au-delà, le code est trop complexe et il vaut mieux recourir à des fonctions. if (expr1 ) { if (expr2 ) { // expr1 et expr2 sont vraies. } else { // expr1 vraie, expr2 fausse } } else if (expr3 ) { // expr1 fausse, expr3 vraie. } else { // expr1 et expr3 fausses. } La structure else if illustrée ci-dessus peut s’écrire également elseif. Elle permet notamment de passer en revue les différentes valeurs possibles pour une expression, et d’exécuter le bloc approprié. Une structure équivalente pour ce type de test est le switch. 432 Chapitre 11. Récapitulatif PHP switch (expression ) { case valeur1 : // expression vaut valeur1. // Il faut sortir du switch ! break; case valeur2 : // expression vaut valeur2. break; default: // expression ne vaut aucune des valeurs list´ees break; } Le switch est une structure de test initialisée avec l’instruction switch (expression ) qui définit expression comme la valeur que l’on va ensuite comparer avec une liste de possibilités. Chaque possibilité de cette liste est représentée par une instruction « case valeur : ». Si expression est égale à valeur, alors les instructions qui suivent sont exécutées, jusqu’à la fin du switch,et ce indépendamment des case ! Pour indiquer que l’on veut sortir de la structure switch dès que la valeur de expression a été rencontrée, et le bloc exécuté, il faut finir ce bloc par une instruction break, comme indiqué ci-dessus. Àlafindublocswitch, il est possible d’ajouter le mot-clé default qui indique l’ensemble des instructions à exécuter si tous les case précédents ont échoué. Signalons, pour conclure sur les tests, qu’il existe une syntaxe légèrement dif- férente pour les if-else. Le bloc après le if ou le else commence par ’:’, et la structure se termine par endif;. if (expression ): // Bloc si expression est vraie. else: // Bloc si expression est fausse. endif; 11.5.2 Boucles Comme d’habitude, on retrouve les même constructions qu’en C, ainsi qu’une instruction foreach pratique pour parcourir les tableaux associatifs. Le while Le while permet d’exécuter un bloc d’insructions tant qu’une condition est remplie. La structure est : while (expression ) { // expression est vraie. } . arithmétiques Opérateur Description $a+$b Addition de $a et $b $a-$b Soustraction de $b à $a $a*$b Multiplication de $a et $b $a/$b Division de $a par $b $a%$b $a modulo $b (reste de la division de $a par. différente de 0 ou de la chaîne vide, et fausse sinon. Tableau 11.3 — Opérateurs logiques Opérateur Description $a && $b (ET) Renvoie vrai si $a ET $b sont vrais. $a and $b Idem que &&. $a. règle est de ne pas s’autoriser plus de deux niveaux d’imbrications. Au-delà, le code est trop complexe et il vaut mieux recourir à des fonctions. if (expr1 ) { if (expr2 ) { // expr1 et expr2