Les opérateurs d'affectation

L'opérateur d'affectation le plus simple est le signe "=". Le premier réflexe est de penser que ce signe veut dire "égal à". Ce n'est pas le cas. Il signifie que l'opérande de gauche se voit affecter la valeur de l'expression qui est à droite du signe égal.

La valeur d'une expression d'affectation est la valeur affectée. Par exemple, la valeur de l'expression '$a = 3' est la valeur 3. Cela permet d'utiliser des astuces telles que :

<?php
$a
= ($b = 4) + 5;
// $a est maintenant égal à 9, et $b vaut 4.
?>

En plus du simple opérateur d'affectation, il existe des "opérateurs combinés" pour tous les opérateurs arithmétiques, l'union de tableaux et pour les opérateurs sur les chaînes de caractères. Cela permet d'utiliser la valeur d'une variable dans une expression et d'affecter le résultat de cette expression à cette variable. Par exemple :

<?php
$a
= 3;
$a += 5; // affecte la valeur 8 à la variable $a correspond à l'instruction '$a = $a + 5';
$b = "Bonjour ";
$b .= " tout le monde!"; // affecte la valeur "Bonjour tout le monde!" à
// la variable $b
// identique à $b = $b." tout le monde!";

?>

On peut noter que l'affectation copie le contenu de la variable originale dans la nouvelle variable (affectation par valeur), ce qui fait que les changements de valeur d'une variable ne modifieront pas la valeur de l'autre. Cela peut se révéler important lors de la copie d'un grand tableau durant une boucle.

Une exception au comportement d'affectation par valeur en PHP est le type object, ceux-ci sont affectés par référence. La copie d'objet doit être explicitement demandée grâce au mot-clé clone.

Affectation par référence

L'affectation par référence est aussi supportée, au moyen de la syntaxe "$var = &$othervar;". L'affectation par référence signifie que les deux variables pointent vers le même conteneur de donnée, rien n'est copié nulle part.

Exemple #1 Affectation par référence

<?php
$a
= 3;
$b = &$a; // $b est une référence à $a

print "$a\n"; // affiche 3
print "$b\n"; // affiche 3

$a = 4; // change $a

print "$a\n"; // affiche 4
print "$b\n"; // affiche 4 aussi, car $b est une référence à $a, qui a été
// changée
?>

L'opérateur new retourne une référence automatiquement, de ce fait, assigner le résultat de new par référence est une erreur

<?php
class C {}

$o = &new C;
?>

L'exemple ci-dessus va afficher :

Parse error: syntax error, unexpected 'new' (T_NEW) in …

Plus d'informations sur les références et leurs utilisations possibles peuvent être trouvées dans la section du manuel Les références expliquées.

Les opérateurs d'affectation arithmétiques

Exemple Equivalent Opération
$a += $b $a = $a + $b Addition
$a -= $b $a = $a - $b Soustraction
$a *= $b $a = $a * $b Multiplication
$a /= $b $a = $a / $b Division
$a %= $b $a = $a % $b Modulo
$a **= $b $a = $a ** $b Exponentiation

Opérateurs d'affectation bits à bits

Exemple Equivalent Opération
$a &= $b $a = $a & $b Opérateur And
$a |= $b $a = $a | $b Opérateur Or
$a ^= $b $a = $a ^ $b Opérateur Xor
$a <<= $b $a = $a << $b Décalage à gauche
$a >>= $b $a = $a >> $b Décalage à droite

Autres opérateurs d'affectation

Exemple Equivalent Opération
$a .= $b $a = $a . $b Concaténation d'une chaîne de caractères
$a ??= $b $a = $a ?? $b Opérateur de coalescence nul
add a note add a note

User Contributed Notes 4 notes

up
129
Peter, Moscow
13 years ago
Using $text .= "additional text"; instead of $text =  $text ."additional text"; can seriously enhance performance due to memory allocation efficiency.

I reduced execution time from 5 sec to .5 sec (10 times) by simply switching to the first pattern for a loop with 900 iterations over a string $text that reaches 800K by the end.
up
59
Robert Schneider
9 years ago
Be aware of assignments with conditionals. The assignment operator is stronger as 'and', 'or' and 'xor'.

<?php
$x
= true and false;   //$x will be true
$y = (true and false); //$y will be false
?>
up
34
Hayley Watson
17 years ago
bradlis7 at bradlis7 dot com's description is a bit confusing. Here it is rephrased.

<?php
$a
= 'a';
$b = 'b';

$a .= $b .= "foo";

echo
$a,"\n",$b;?>
outputs

abfoo
bfoo

Because the assignment operators are right-associative and evaluate to the result of the assignment
<?php
$a
.= $b .= "foo";
?>
is equivalent to
<?php
$a
.= ($b .= "foo");
?>
and therefore
<?php
$b
.= "foo";
$a .= $b;
?>
up
12
asc at putc dot de
9 years ago
PHP uses a temporary variable for combined assign-operators (unlike JavaScript), therefore the left-hand-side (target) gets evaluated last.

Input:
$a += $b + $c;

Meaning:
$a = ($b + $c) + $a;

Not:
$a = $a + ($b + $c);

This can be important if the target gets modified inside the expression.

$a = 0;
$a += (++$a) + (++$a); // yields 5 (instead of 4)
To Top