Un opérateur prend une ou plusieurs valeurs et en produit une nouvelle : $a + $b additionne, $a . $b assemble des chaînes, $a && $b est un ET logique, $a === $b compare, $i++ incrémente.
/ renvoie un float sauf si deux entiers se divisent exactement : 17 / 5 vaut 3.4, 10 / 5 vaut l'entier 2. Quand vous ne voulez que la partie entière, utilisez intdiv(). Les arrondis sont expliqués sur la page des fonctions mathématiques.
Opérateurs arithmétiques
| Opérateur | Nom | Exemple | Résultat |
|---|---|---|---|
+ | Addition | 7 + 2 | 9 |
- | Soustraction | 7 - 2 | 5 |
* | Multiplication | 7 * 2 | 14 |
/ | Division | 7 / 2 | 3.5 |
% | Modulo (reste) | 7 % 2 | 1 |
** | Puissance | 7 ** 2 | 49 |
-$a | Négation | -7 | -7 |
Le modulo sert pour les cas « un élément sur N » et les tests pair/impair. Son résultat prend le signe du côté gauche, et une division par zéro lève une erreur que vous pouvez intercepter :
Opérateurs d'affectation
= stocke une valeur. Chaque opérateur arithmétique et de chaîne a une forme combinée qui met à jour une variable sur place.
??= appartient à la famille de l'opérateur de fusion null. Il n'affecte que si la variable n'est pas définie ou vaut null.
Incrémenter et décrémenter : ++ et --
$i++ renvoie la valeur actuelle, puis ajoute 1. ++$i ajoute 1, puis renvoie la nouvelle valeur. La différence n'apparaît que si vous utilisez le résultat dans la même expression.
L'astuce sur les lettres est souvent utilisée pour générer des noms de colonnes de tableur (A, B, ... Z, AA).
Opérateurs logiques : &&, ||, ! et xor
| Opérateur | Vrai quand |
|---|---|
$a && $b | les deux sont vrais |
$a || $b | au moins un est vrai |
!$a | $a est faux |
$a xor $b | exactement un est vrai |
$a and $b, $a or $b | comme && et ||, avec une priorité plus faible |
&& et || court-circuitent : le côté droit n'est pas évalué quand le côté gauche décide déjà du résultat. C'est ce qui rend isset($user) && $user->isAdmin() sûr.
and ou && : le piège de la priorité
and et or sont moins prioritaires que =, donc dans une affectation ils s'appliquent après le stockage de la valeur. C'est un bug classique :
Cette faible priorité est utile dans un idiome, $file = fopen($path, 'r') or die('Cannot open');, où vous voulez que l'affectation ait lieu d'abord. Partout ailleurs, utilisez && et ||.
Opérateurs de chaîne : . et .=
PHP a deux opérateurs de chaîne : . assemble deux chaînes ("Grace" . " " . "Hopper") et .= ajoute à une variable ($html .= "<li>"). + n'assemble jamais de chaînes : "3" + "4" donne le nombre 7, alors que "3" . "4" donne la chaîne "34". La page sur les chaînes traite de l'interpolation et des guillemets.
La comparaison et l'opérateur spaceship <=>
== compare après conversion des types, === vérifie aussi le type, et <=> renvoie -1, 0 ou 1, exactement ce dont ont besoin les fonctions de tri. Les détails et le tableau complet des comparaisons souples sont sur la page des opérateurs de comparaison.
Opérateurs de tableau
+ sur des tableaux est une union : les clés du tableau de gauche l'emportent et seules les clés absentes sont ajoutées depuis la droite. Cela surprend ceux qui s'attendent à un ajout à la fin. == vérifie les mêmes paires clé/valeur, === exige aussi le même ordre et les mêmes types.
Pour ajouter une liste à la suite d'une autre, utilisez array_merge() ou la syntaxe de décomposition [...$a, ...$b].
Priorité des opérateurs
Quand une expression mélange des opérateurs, PHP les applique dans un ordre fixe. Ceux qui piègent le plus souvent, avec ce qu'affiche PHP 8.3 :
echo 2 + 3 * 4; // 14: * before +
echo (2 + 3) * 4; // 20
echo 2 ** 3 ** 2; // 512: right to left, 2 ** 9
echo -2 ** 2; // -4: ** before unary minus
echo "Sum: " . 2 + 3; // Sum: 5, since PHP 8 + runs before .
En cas de doute, ajoutez des parenthèses. Elles ne coûtent rien, et la prochaine personne qui lira la ligne n'aura pas à se souvenir du tableau.
Questions fréquentes
Quelle est la différence entre and et && en PHP ?
Les deux sont des ET logiques, mais and a une priorité plus faible que =. Donc $x = true and false; stocke true dans $x (l'affectation a lieu d'abord), alors que $x = true && false; stocke false. Utilisez && et || dans les expressions et gardez and/or hors des affectations.
Que fait % en PHP ?
% est l'opérateur modulo : il renvoie le reste d'une division entière, donc 10 % 3 vaut 1. Le résultat prend le signe de l'opérande de gauche (-7 % 3 vaut -1). Pour les floats, utilisez fmod(), et % 0 lève une DivisionByZeroError.
Comment élever un nombre à une puissance en PHP ?
Utilisez l'opérateur ** : 2 ** 10 vaut 1024. Il est associatif à droite, donc 2 ** 3 ** 2 vaut 2 ** 9 = 512, et il est prioritaire sur le moins unaire, donc -2 ** 2 vaut -4. La fonction pow(2, 10) fait la même chose.
Quelle est la différence entre $i++ et ++$i en PHP ?
Les deux ajoutent 1 à $i. $i++ (post-incrémentation) renvoie l'ancienne valeur puis incrémente ; ++$i (pré-incrémentation) incrémente d'abord et renvoie la nouvelle valeur. Seul sur une ligne, comme l'étape d'une boucle for, il n'y a aucune différence.