Los operadores de asignación

El operador de asignación más simple es el signo "=". El primer reflejo es pensar que este signo significa "igual a". No es el caso. Significa que el operando de la izquierda se ve asignado el valor de la expresión que está a la derecha del signo igual.

El valor de una expresión de asignación es el valor asignado. Por ejemplo, el valor de la expresión '$a = 3' es el valor 3. Esto permite utilizar trucos tales como:

Ejemplo #1 Asignaciones anidadas

<?php
$a
= ($b = 4) + 5;
// $a ahora es igual a 9, y $b vale 4.
var_dump($a);
?>

Además del simple operador de asignación, existen "operadores combinados" para todos los operadores aritméticos, la unión de arrays y para los operadores sobre los strings. Esto permite utilizar el valor de una variable en una expresión y asignar el resultado de esta expresión a esta variable. Por ejemplo:

Ejemplo #2 Asignaciones Combinadas

<?php
$a
= 3;
$a += 5; // asigna el valor 8 a la variable $a corresponde a la instrucción '$a = $a + 5';
$b = "Hola ";
$b .= " a todos!"; // asigna el valor "Hola a todos!" a
// la variable $b
// idéntico a $b = $b." a todos!";

var_dump($a, $b);
?>

Se puede observar que la asignación copia el contenido de la variable original en la nueva variable (asignación por valor), lo que hace que los cambios de valor de una variable no modificarán el valor de la otra. Esto puede ser importante al copiar un gran array durante un bucle.

Una excepción al comportamiento de asignación por valor en PHP es el tipo object, estos son asignados por referencia. La copia de objeto debe ser explícitamente solicitada gracias al mot-clé clone.

Asignación por referencia

La asignación por referencia también es soportada, mediante la sintaxis "$var = &$othervar;". La asignación por referencia significa que las dos variables apuntan al mismo contenedor de datos, nada es copiado en ningún lugar.

Ejemplo #3 Asignación por referencia

<?php
$a
= 3;
$b = &$a; // $b es una referencia a $a

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

$a = 4; // cambia $a

print "$a\n"; // muestra 4
print "$b\n"; // muestra 4 también, porque $b es una referencia a $a, que ha sido
// cambiada
?>

El operador new devuelve una referencia automáticamente, por lo tanto, asignar el resultado de new por referencia es un error

Ejemplo #4 Nuevo operador por referencia

<?php
class C {}

$o = &new C;
?>

El resultado del ejemplo sería:

Parse error: syntax error, unexpected token ";", expecting "("

Más información sobre las referencias y sus usos posibles pueden ser encontrados en la sección del manual Las referencias explicadas.

Los operadores de asignación aritméticos

Ejemplo Equivalente Operación
$a += $b $a = $a + $b Adición
$a -= $b $a = $a - $b Sustracción
$a *= $b $a = $a * $b Multiplicación
$a /= $b $a = $a / $b División
$a %= $b $a = $a % $b Módulo
$a **= $b $a = $a ** $b Exponenciación

Operadores de asignación bits a bits

Ejemplo Equivalente Operación
$a &= $b $a = $a & $b Operador And
$a |= $b $a = $a | $b Operador Or
$a ^= $b $a = $a ^ $b Operador Xor
$a <<= $b $a = $a << $b Desplazamiento a la izquierda
$a >>= $b $a = $a >> $b Desplazamiento a la derecha

Otros operadores de asignación

Ejemplo Equivalente Operación
$a .= $b $a = $a . $b Concatenación de un string
$a ??= $b $a = $a ?? $b Operador de coalescencia nul
add a note

User Contributed Notes 4 notes

up
139
Peter, Moscow
14 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
60
Robert Schneider
10 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
30
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
16
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