CascadiaPHP 2024

Operadores de Atribuição

O operador básico de atribuição é "=". A sua primeira inclinação deve ser a de pensar nisto como "é igual". Não. Isto quer dizer, na verdade, que o operando da esquerda recebe o valor da expressão da direita (ou seja, "é definido para").

O valor de uma expressão de atribuição é o valor atribuído. Ou seja, o valor de "$a = 3" é 3. Isto permite que você faça alguns truques:

<?php

$a
= ($b = 4) + 5; // $a é igual a 9 agora e $b foi definido como 4.

?>

Além do operador básico de atribuição, há "operadores combinados" para todos os operadores aritméticos, de array e string que permitem a você pegar um valor de uma expressão e então usar seu próprio valor para o resultado daquela expressão. Por exemplo:

<?php

$a
= 3;
$a += 5; // define $a para 8, como se disséssemos: $a = $a + 5;
$b = "Bom ";
$b .= "Dia!"; // define $b para "Bom Dia!", como em $b = $b . "Dia!";

?>

Note que a atribuição copia a variável original para a nova (atribuição por valor), assim a mudança de uma não afeta a outra. Isto pode ser relevante se você precisa copiar algo como uma grande matriz dentro de um loop apertado.

Uma exceção ao comportamento geral de atribuição ocorre com objects, que são atribuídos por referência. Objetos podem ser explicitamente copiados através da instrução clone.

Atribuição por referência

Atribuição por referência também é possível, utilizando-se a sintaxe "$var = &$othervar;". A atribuição por referência significa que ambas as variáveis apontam para o mesmo dado, e nada é copiado.

Exemplo #1 Atribuição por referência

<?php
$a
= 3;
$b = &$a; // $b é uma referência de $a

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

$a = 4; // modificamos $a

print "$a\n"; // imprime 4
print "$b\n"; // imprime 4 também, pois $b é uma referência de $a, que foi
// modificada
?>

O operador new retorna uma referência automaticamente, de forma que a atribuição de um resultado de new por referência é um erro.

<?php
class C {}

$o = &new C;
?>

O exemplo acima produzirá:

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

Mais informações sobre referências e seus potenciais usos podem ser encontrados na seção Explicando Referências do manual.

Arithmetic Assignment Operators

Exemplo Equivalente Operação
$a += $b $a = $a + $b Adição
$a -= $b $a = $a - $b Subtração
$a *= $b $a = $a * $b Multiplicação
$a /= $b $a = $a / $b Divisão
$a %= $b $a = $a % $b Módulo
$a **= $b $a = $a ** $b Exponentiation

Operadores de bits

Exemplo Equivalente Operação
$a &= $b $a = $a & $b Bitwise E
$a |= $b $a = $a | $b Bitwise Ou
$a ^= $b $a = $a ^ $b Bitwise Xor
$a <<= $b $a = $a << $b Desloca para esquerda
$a >>= $b $a = $a >> $b Desloca para direita

Outras operações de assimilação

Exemplo Equivalente Operação
$a .= $b $a = $a . $b Concatenação de strings
$a ??= $b $a = $a ?? $b Aglutinação de nulls (null coalesce)
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
35
Hayley Watson
16 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
8 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