PHP 5.6.0beta1 released

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.

?>

Per gli array, l'assegnazione di un valore a una chiave è ottenuto usando l'operatore "=>". La precedenza di questo operatore è la stessa degli altri operatori d'assegnazione.

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 in PHP 5. 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
?>

Da PHP 5, l'operatore new restituisce automaticamente un riferimento, quindi assegnare il risultato di new per riferimento risulta in un messaggio E6DEPRECATED in PHP 5.3 e successivi, e un messaggio E_STRICT nelle version precedenti.

Per esempio, quesco codice provocherà un avvertimento:

<?php
class {}

/* la prossima linea genera il seguente messaggio di errore:
 * Deprecated: Assigning the return value of new by reference is deprecated in...
 */
$o = &new C;
?>

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

add a note add a note

User Contributed Notes 6 notes

up
66
straz at mac dot nospam dot com
10 years ago
This page really ought to have table of assignment operators,
namely,

See the Arithmetic Operators page (http://www.php.net/manual/en/language.operators.arithmetic.php)
Assignment    Same as:
$a += $b     $a = $a + $b    Addition
$a -= $b     $a = $a - $b     Subtraction
$a *= $b     $a = $a * $b     Multiplication
$a /= $b     $a = $a / $b    Division
$a %= $b     $a = $a % $b    Modulus

See the String Operators page(http://www.php.net/manual/en/language.operators.string.php)
$a .= $b     $a = $a . $b       Concatenate

See the Bitwise Operators page (http://www.php.net/manual/en/language.operators.bitwise.php)
$a &= $b     $a = $a & $b     Bitwise And
$a |= $b     $a = $a | $b      Bitwise Or
$a ^= $b     $a = $a ^ $b       Bitwise Xor
$a <<= $b     $a = $a << $b     Left shift
$a >>= $b     $a = $a >> $b      Right shift
up
10
Peter, Moscow
3 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
6
Hayley Watson
6 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
2
bradlis7 at bradlis7 dot com
8 years ago
Note whenever you do this

<?php
$a
.= $b .= "bla bla";
?>

it comes out to be the same as the following:

<?php
$a
.= $b."bla bla";
$b .= "bla bla";
?>

So $a actually becomes $a and the final $b string. I'm sure it's the same with numerical assignments (+=, *=...).
up
-1
Hayley Watson
6 years ago
You could also take adam at gmail dot com's xor-assignment operator and use the fact that it's right-associative:

$a ^= $b ^= $a ^= $b;
up
-4
haubertj at alfredstate dot edu
2 years ago
[[   Editor's note: You are much better off using the foreach (array_expression as $key => $value) control structure in this case   ]]

When using

<php
while ($var = current($array) {
#do stuff
next($aray)
?>

to process an array, if current($array) happens to be falsy but not === false it will still end the loop.  In such a case strict typing must be used.

Like this:

<php
while (($var = current($array)) !== FALSE) {
#do stuff
next($aray)
?>

Of course if your array may contain actual FALSE values you will have to deal with those some other way.
To Top