CakeFest 2024: The Official CakePHP Conference

Operatori di assegnazione

L'operatore di base dell'assegnazione è "=". Il primo impulso può essere quello di pensare che corrisponda a "uguale a". Invece questo operatore significa che l'operando a sinistra assume il valore dell'espressione a destra (cioè, "assegna il valore a").

Il valore di un'espressione di assegnazione è il valore assegnato. Ovvero il valore di "$a = 3" è 3. Questo permette di fare qualche trucchetto:

<?php

$a
= ($b = 4) + 5; // $a è uguale a 9 ora, e $b è stato impostato a 4.

?>

In aggiunta all'operatore di base dell'assegnazione, ci sono gli "operatori combinati" per tutta l'aritmetica binaria e gli operatori di stringa che consentono di usare un valore in un'espressione e poi impostare il suo valore al risultato di quell'espressione. Per esempio:

<?php

$a
= 3;
$a += 5; // imposta $a a 8, corrispondente a: $a = $a + 5;
$b = "Ciao ";
$b .= "come va?"; // imposta $b a "Ciao come va?", proprio come $b = $b . "come va?";

?>

Si noti che l'assegnazione copia la variabile originale nella nuova (assegnazione per valore), così i cambiamenti della prima non si verificheranno nell' altra. Ciò può anche avere rilevanza se si ha bisogno di copiare un grande array in un ciclo molto stretto.

Un'eccezione al comportamento standard dell'assegnazione per valore avviene con gliobject, che sono assegnati per riferimento. Gli oggetti possono essere copiati esplicitamente attraverso la keyword clone.

Assegnazione per referimento

L'assegnazione per riferimento è pure supportato, usando la sintassi "$var = &$othervar;. 'Assegnazione per riferimento' significa che entrambe le variabili finiscono con il puntare agli stessi dati, e nulla è copiato.

Example #1 Assegnare per riferimento

<?php
$a
= 3;
$b = &$a; // $b è un riferimento ad $a

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

$a = 4; // modifica $a

print "$a\n"; // stampa 4
print "$b\n"; // stampa ugualmente 4, dal momento che $b è un riferimento ad $a, che è
// stata modificata
?>

L'operatore new restituisce automaticamente un riferimento, quindi assegnare il risultato di new per riferimento è un errore.

<?php
class C {}

$o = &new C;
?>

Il precedente esempio visualizzerà:

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

Ulteriori informazioni sui riferimenti e sul loro uso possono essere trovati nella sezione del manuale Spiegazioni sui riferimenti.

Operatori di Assegnamento Aritmetici

Esempio Equivalente Operazione
$a += $b $a = $a + $b Addizione
$a -= $b $a = $a - $b Sottrazione
$a *= $b $a = $a * $b Moltiplicazione
$a /= $b $a = $a / $b Divisione
$a %= $b $a = $a % $b Modulo
$a **= $b $a = $a ** $b Esponenziale

Operatori di Assegnazione Bit A Bit

Esempio Equivalente Operazione
$a &= $b $a = $a & $b And Bit a Bit
$a |= $b $a = $a | $b Or Bit a Bit
$a ^= $b $a = $a ^ $b Xor Bit a Bit
$a <<= $b $a = $a << $b Shift a Sinistra
$a >>= $b $a = $a >> $b Shift a Destra

Altri Operatori di Assegnamento

Esempio Equivalente Operazione
$a .= $b $a = $a . $b Concatenazione di stringhe
$a ??= $b $a = $a ?? $b 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