[Plan du site]
Vous êtes ici ---
> Le Site du Zéro
> Les tutoriels
> Non-Officiels
> Site Web
> PHP
> Langage, bibliothèques et fonctions
> [Langage] Amusons-nous avec PHP > Les bases du langage > Les opérateurs : partie I
> Lecture du tutoriel
Les opérateurs : partie I
Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Dans le chapitre précédent, on a parlé de variables. Mais on a également évoqué le terme "opérateur d'affectation". En PHP, comme dans beaucoup de langages, il existe plusieurs opérateurs.
Ils servent à faire beaucoup de choses : attribuer une valeur, faire une addition, une division, faire des comparaisons, etc.
Dans ce chapitre, je vais vous présenter un nombre réduit d'opérateurs. Mais ce petit nombre va m'amener à introduire une nouvelle notion plus importante encore que les variables : la notion d'expression.
Dans le chapitre précédent, on a parlé de plusieurs choses : de variables, de types, de valeurs et d'un opérateur d'affectation.
Seulement, comme dans la vie tout n'est pas toujours rose, je dois vous avouer quelque chose : vous ne savez pas tout. J'ai volontairement oublié de vous parler de la notion qui est le véritable coeur de PHP : les expressions. Je l'ai fait pour vous simplifier les choses, je ne voulais pas vous embrouiller trop vite ; mais maintenant que vous avez passé le cap des variables, il est temps de bien vous embrouiller

.
Revenons en arrière. Je vous ai dit, et je me cite :
Citation : MoiL'opérateur d'affectation est bien un égal (=), toutefois, écrire $ma_variable = valeur; ne veut pas dire que $ma_variable est égal à valeur. Ce bout de code veut dire qu'on affecte, ou qu'on attribue, la valeur de l'opérande de droite à la variable $ma_variable. C'est une question de terminologie, mais c'est important de le savoir !
En voulant simplifier, je détourne la réalité. Voici la définition réelle : l'opérateur d'affectation attribue la valeur de l'expression qui se trouve à droite du signe égal à l'opérande qui se trouve à gauche du signe égal.
C'est bien joli, mais qu'est-ce qu'une expression, d'après vous ? N'essayez pas de chercher quelque chose de compliqué, ça tient en quelques mots.

Vu que vous avez l'air de patauger dans la semoule, voilà la définition d'une expression : c'est quelque chose qui a une valeur. Une expression se caractérise par sa valeur, et par le type de sa valeur (souvenez-vous, les INT, FLOAT, etc.).
Cette définition entraîne autre chose, que vous comprendrez dans peu de temps : en PHP, tout ou presque est une expression.
Il en existe différents "types", mais deux seulement pour les expressions simples : les variables et les valeurs constantes.
Vous connaissez un de ces deux "types", les variables ; le second vous échappe encore. Comme son nom nom ne l'indique pas, une valeur constante est une valeur qui ne varie pas (l'opposé d'une variable, quoi).
Et vous savez quoi ? Je vous ai déjà fait manipuler des valeurs constantes.
Reprenons un bout de code :
Code : PHP1
2
3 | <?php
$ma_variable = 5;
?>
|
Avec l'ancienne vision des choses, vous comprenez que ce code déclare une variable, qu'on lui affecte la valeur qui se trouve à droite, c'est-à-dire 5 (un entier).
Avec la vraie définition de l'opérateur d'affectation, voilà ce que vous devriez comprendre :
- on déclare une variable
- la variable déclarée hérite du type de l'expression qui se trouve à droite du signe égal
- l'expression de droite a pour valeur '5'
- l'expression de droite est du type 'entier constant'
- au final, la valeur de la variable est '5' et son type est entier (INT).
Ça paraît compliqué ? Vous n'avez encore rien vu.

Pour l'instant, j'ai uniquement parlé de l'expression de droite. Mais le plus drôle dans tout ça, c'est qu'il y a une deuxième expression !
Mieux qu'un long discours, un bout de code. Dans ce code, toutes les expressions sont entourées de parenthèses :
Code : PHP1
2
3 | <?php
($ma_variable = (5));
?>
|
Là, si vous n'êtes pas encore embrouillés, chapeau bas

.
Comme vous le constatez, j'ai mis des parenthèses autour de '5', qui est une expression de valeur '5' et de type entier constant.
Mais j'ai également mis des parenthèse autour de '
$ma_variable = 5;'. Eh oui, c'est une expression.
Reprenons la définition d'une expression. Une expression est quelque chose qui a une valeur.
Mais dites-moi, en affectant une expression à une variable, cette dernière ne prend-elle pas la valeur de l'expression ? Si ! Et donc après une affectation, la variable a une valeur. Or, tout ce qui a une valeur, est une expression.
Maintenant mon petit discours sur les expressions est fini.
Ok... mais à quoi ça va nous servir de savoir ça ?
Je vous l'ai dit : le coeur de PHP, ce sont les expressions. Si vous arrivez à maîtriser ce concept, vous pourrez coder en sachant exactement ce que vous faites, pourquoi vous le faites, comment vous le faites, etc. Et d'ailleurs, désormais, j'utiliserai la notion d'expression très souvent ; alors, vous feriez bien de la maîtriser.
Après cette courte introduction sur les expressions, on va pratiquer un petit peu, ça me servira pour vous montrer plus en détail ce que sont les expressions.
A l'école, vous avez dû apprendre quatre opérations de base en mathématiques : l'addition, la soustraction, la multiplication et la division. PHP permet de faire ces opérations grâce aux
opérateurs arithmétiques.
Opérateur arithmétique d'addition
Comme toujours, code à l'appui, c'est plus simple :
Code : PHP1
2
3
4 | <?php
$ma_variable = 5 + 2;
var_dump($ma_variable);
?>
|
Vous venez de faire votre première addition en PHP. Maintenant, c'est l'heure de l'explication sur le fonctionnement de l'opérateur arithmétique d'addtion : il fait la somme des expressions qui se trouvent à sa gauche et à sa droite. Ici, l'expression de droite est un entier de valeur '2' et l'expression de gauche est un entier de valeur '5'. La somme est donc un entier de valeur '7'.
Cet opérateur est très simple à comprendre. Toutefois, je vais encore
blablater dessus

.
Qu'est-ce qu'on peut additionner ?
Si je vous demande d'additionner deux chaînes de caractères, qu'est-ce que vous allez faire ?
Les mettre l'une à la suite de l'autre ?
Additionner le nombre de caractères des deux ?
Danser le hoola-hop ?
Pour PHP, c'est pareil, il ne peut pas additionner de chaînes de caractères. Mais au lieu de faire la liste de ce qu'il ne peut pas additionner, on va faire la liste de ce qu'il peut additionner : des entiers (INT) et des nombres à virgule (FLOAT).
Si vous demandez à PHP d'additionner autre chose que cela, il va faire la même chose que quand on affecte une valeur à une variable : il va transtyper la ou les expressions qu'on veut additionner et qui ne sont pas des entiers ou des nombres à virgule.
Malheureusement, le transtypage, on verra ça plus tard. Pour le moment, ne tentez pas d'additionner autre chose que des entiers ou des nombres à virgule.
Dernières choses sur cet opérateur : quel type de valeur retourne-t-il ?
Réfléchissons. On peut lui donner des entiers ou des nombres à virgule, logiquement, il nous ressortira la même chose.
Voici un tableau qui donne les différents types de valeur possible :
| Types des expressions | Type de la valeur retournée |
|---|
| INT + INT |
INT |
| FLOAT + INT |
FLOAT |
| INT + FLOAT |
FLOAT |
| FLOAT + FLOAT |
FLOAT |
Pour simplifier, on peut dire qu'une addition retourne toujours un FLOAT sauf si les deux expressions qu'on additionne sont des INT.
Opérateur arithmétique de soustraction
Si vous avez compris l'opérateur précédent, ça ira très vite : tout est pareil. La seule différence, c'est qu'au lieu de faire une addition, on fait une soustraction.
Code : PHP1
2
3
4 | <?php
$ma_variable = 5 - 2;
var_dump($ma_variable);
?>
|
Opérateur arithmétique de multiplication
A nouveau, très facile si vous avez compris l'opérateur d'addition. On multiplie les expressions entre elles. Tout comme l'addition et la soustraction, la multiplication retourne un nombre à virgule si au moins une des deux expressions qu'on multiplie est un nombre à virgule.
Code : PHP1
2
3
4 | <?php
$ma_variable = 4.5 * 6;
var_dump($ma_variable);
?>
|
Opérateur arithmétique de division
Comme toujours, cet opérateur est très simple à manipuler, il retourne la valeur de la division des deux expressions.
Code : PHP1
2
3
4 | <?php
$ma_variable = 5 / 2;
var_dump($ma_variable);
?>
|
Oh ben zut ! Je donne deux entiers, mais le type de ma variable est FLOAT et non INT

.
Ce n'est pas une erreur, c'est logique !
Après tout, 5/2, ça vaut 2.5, non ? Et ce 2.5 est un nombre à virgule, non ? Donc la valeur retournée est du type FLOAT. En réalité, on peut simplifier ça : le type de valeur retournée par l'opérateur arithmétique division est déterminé par le résultat de la division. Si le résultat est un entier (10/2, par exemple donne un résultat entier), l'opérateur retourne un INT. Si le résultat n'est pas un entier (5/2 par exemple), l'opérateur retourne un FLOAT.
Pour vous en convaincre, faites des
var_dump() de 5 divisé par 5, de 2.5 divisé par 2.5, de 5 divisé par 2.5, etc.
Résumons vite fait ce chapitre : on a vu une introduction sur les expressions, les quatre opérateurs arithmétiques, leur fonctionnement, les types d'expressions qu'ils acceptent et qu'ils retournent.
Maintenant, on va faire un peu de calcul. Ce n'est pas vraiment complexe, c'est juste pour différencier un calcul comme 4 + 5 d'un calcul comme 5 / 2 * 5 + 1

.
En mathématiques, les différentes opérations ont des priorités différentes. En PHP, c'est pareil.
Exemple :
Code : PHP1
2
3
4 | <?php
$calcul = 4 + 5 * 2;
var_dump($calcul);
?>
|
Mon but, c'est de faire la somme de quatre et de cinq, puis de multiplier le tout par deux (c'est égal à 18). Seulement, en mathématiques, la multiplication a une priorité plus grande que l'addition, et donc on fait d'abord la multiplication (5 * 2 = 10) et ensuite l'addition (4 + 10) ; le résultat est donc 14.
Le résultat n'est donc pas celui que j'attendais. En mathématiques, pour forcer la priorité, on utilise des parenthèses. En PHP, c'est pareil. Mon code devient donc :
Code : PHP1
2
3
4 | <?php
$calcul = (4 + 5) * 2;
var_dump($calcul);
?>
|
Cette fois, j'obtiens le résultat attendu : 18. C'est pareil pour tous les opérateurs arithmétiques, chacun à sa propre priorité. Voici l'ordre de priorité de ces quatre opérateurs, du plus au moins prioritaire :
*,
/,
+,
-.
En réalité, ce n'est pas tout à fait vrai.
Exemple : je veux diviser cent-vingt par le résultat de la multiplication de quatre par trois. Avec ces priorités, je taperais ceci :
Code : PHP1
2
3
4 | <?php
$calcul = 120 / 4 * 3;
var_dump($calcul);
?>
|
Manque de chance : au lieu d'avoir 10, j'obtiens 90.
Pas de panique, c'est normal : je vous ai menti. D'après ce que j'ai dit, l'opérateur de multiplication a une priorité plus grande que l'opérateur de division. C'est faux : ils ont le même niveau de priorité.
Et il en va de même pour les opérateurs d'addition et de soustraction : ils ont le même niveau de priorité.
Pour obtenir le résultat que je veux, je dois donc utiliser des parenthèses :
Code : PHP1
2
3
4 | <?php
$calcul = 120 / (4 * 3);
var_dump($calcul);
?>
|
Un cinquième opérateur arithmétique : le modulo
En mathématiques, quand vous faisiez une division qui ne tombe pas juste, cinq divisé par deux par exemple, vous aviez deux choses à la fin : le résultat de la division et le reste. Quand vous divisez cinq par deux, le résultat de la division est deux (on peut mettre deux fois deux dans cinq) et le reste est un (cinq moins deux fois deux égal un).
Il est parfois pratique de calculer le reste d'une division entière (vous verrez un exemple plus tard), et pour cela, PHP met un autre opérateur à notre disposition : le modulo (
%).
Exemple : je veux connaître le reste de la division entière de dix-sept par trois :
Code : PHP1
2
3
4 | <?php
$calcul = 17 % 3;
var_dump($calcul);
?>
|
J'obtiens bien le reste de la division entière : deux.
Il est à noter que le niveau de priorité du modulo est le même que le niveau des opérateurs de multiplication et de division.
De même, le niveau de priorité de l'opérateur d'affectation est plus petit que le niveau de priorité des opérateurs de multiplication, de division et de modulo.
Cette partie n'est pas forcément nouvelle pour vous, les règles de calcul en PHP et en mathématiques sont identiques. Mais il était indispensable de faire cela pour introduire la notion de priorité des opérateurs, c'est souvent la cause de nombreux problèmes et on en reparlera plus tard. Retenez bien que tous les opérateurs arithmétiques ont un niveau de priorité supérieur à l'opérateur d'affectation.
Vous vous demandez peut-être pourquoi j'ai décidé de parler des opérateurs et des expressions dans le même chapitre. La raison est simple : grâce aux opérateurs, on peut mettre en pratique la théorie qu'on a vue sur les expressions

. Vous vous en doutez donc, cette partie sera un peu plus pratique et devrait clarifier la notion d'expression.
On va faire un jeu : je vais vous donner quelques codes, et vous tenterez de compter le nombre d'expressions qu'il y a dans ces codes ; exemple :
Code : PHP1
2
3 | <?php
($ma_variable = (5));
?>
|
Les expressions présentes sont :
Il y a donc deux expressions.
Rappel de la définition d'une expression : tout ce qui a une valeur.
Code : PHP1
2
3
4 | <?php
$var = 'lala';
$_var = 5.6;
?>
|
Secret (cliquez pour afficher)Il y a quatre expressions :
- $var = 'lala'
- 'lala'
- $_var = 5.6
- 5.6
Rien de compliqué, il n'y a qu'à compter.
Code : PHP
Secret (cliquez pour afficher)Il y a quatre expressions :
- $var = 5 * 6
- -> 5 * 6
- --> 5
- --> 6
La seule chose à ne pas oublier, c'est que l'opérateur arithmétique retourne la valeur de l'expression qui est égale à la multiplication des expressions qui se trouvent à sa gauche et à sa droite.
Code : PHP
Secret (cliquez pour afficher)Il y a trois expressions :
- $a = $b = 5
- -> $b = 5
- --> 5
Ici, un petit piège pour vous rappeler la définition de l'opérateur d'affectation : il affecte la valeur de l'expression de droite à l'opérande de gauche. Ce qui veut dire que l'expression de droite est interprétée avant d'être affectée. L'expression de droite étant elle-même une affectation, on interprète à nouveau l'expression de droite en premier.
PHP fait donc ceci : il déclare la variable
$b et lui affecte la valeur
5 ; ensuite, il déclare
$a et lui affecte la valeur de
$b (au sens strict du terme, ce que je dis n'est pas correct, mais dans les faits, on peut le voir comme ça).
Code : PHP1
2
3 | <?php
$var = 5 * (6 / ($a = 4)) % 2;
?>
|
Secret (cliquez pour afficher)Il y a dix expressions :
- $var = 5 * (6 / ($a = 4)) % 2
- -> 5 * (6 / ($a = 4)) % 2
- --> 5 * (6 / ($a = 4))
- --> (6 / ($a = 4)) % 2
- ---> 5
- ---> 2
- ---> (6 / ($a = 4))
- ----> 6
- ----> ($a = 4)
- -----> 4
Là, il n'y a pas de méthode miracle : il faut compter

. Si vous avez trouvé le bon nombre d'expressions, vous cernez bien ce qu'est une expression, et c'est très bien !

Maintenant que ce petit jeu est fini, vous devriez commencer à bien percevoir ce qu'est une expression. Je l'ai dit mais je le redis : c'est l'élément fondamental de PHP. Tout ou presque, est une expression en PHP.
Le vrai visage de var_dump()
Dans le chapitre précédent, j'ai introduit un élément :
var_dump(). Pour l'utiliser, je vous ai dit qu'il fallait mettre une variable ou une valeur entre les parenthèses.
Maintenant que vous êtes incollables sur les expressions, je peux dire les choses comme elles le sont.
Pour utiliser
var_dump(), vous devez mettre une expression entre les parenthèses.
Ce qui implique qu'on peut mettre beaucoup de choses !
Souvenez-vous ce que l'on faisait : d'abord, on déclarait notre variable en lui affectant une valeur, ensuite on utilisait
var_dump().
Mais, une affectation, d'après ce que j'ai dit, n'est-ce pas une expression ? Eh bien si !
A la place de ceci :
Code : PHP1
2
3
4 | <?php
$var = 'lala';
var_dump($var);
?>
|
On peut écrire ceci :
Code : PHP1
2
3 | <?php
var_dump($var = 'lala');
?>
|
Ou encore ceci si on est sûrs de ne pas avoir besoin de la variable par la suite :
Code : PHP1
2
3 | <?php
var_dump('lala');
?>
|
Je vous déconseille d'utiliser le second code. Il est correct au niveau de la syntaxe, mais si vous vous amusez à réduire le nombre de lignes en mettant des affectations un peu partout, vous allez rendre votre code beaucoup plus difficile à lire, et vous ne gagnerez rien, que ce soit en termes de performance ou de taille du fichier qui contient votre code.
Un nouveau chapitre fini : beaucoup de nouvelles choses apprises

.
Comme je l'ai déjà dit, n'hésitez surtout pas à relire plusieurs fois si quelque chose ne vous paraît pas clair (mais si même en forçant ce n'est pas clair, je serai ravi de vous expliquer par MP).
Si tout vous paraît limpide, rendez-vous au prochain chapitre : "
Les opérateurs : partie II".