Assegnazione per Riferimento
Attraverso questa prima operazione, i riferimenti PHP permettono di
far sì che due variabili facciano riferimento allo stesso contenuto. Questo significa, che scrivendo:
$a e
$b
puntano allo stesso contenuto.
Nota:
$a e $b sono completamente
uguali, ma $a non è un puntatore a
$b o vice versa,
$a e $b puntano semplicemente nello
stesso posto.
Nota:
Se si assegna, si passa o si restituisce per riferimento una variabile non definita,
questa verrà creata.
Example #1 Uso dei riferimenti con variabili non definite
<?php
function foo(&$var) { }
foo($a); // $a is "created" and assigned to null
$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)
$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>
La stessa sintassi può essere usata con funzioni che restituiscono
riferimenti, e con l'operatore new
(a partire da PHP
4.0.4 e prima di PHP 5.0.0):
Da PHP 5,
new
restituisce automaticamente un riferimento, quindi
usare
=&
in questo contesto è deprecato e
produce un messaggio
E_DEPRECATED
in PHP 5.3 e
successivi, e un messaggio
E_STRICT
nelle versioni precedenti.
(Tecnicamente, la differenza consiste nel fatto che, in PHP 5, le variabili object, come pure le
risorse, sono semplici puntatori ai veri dati dell'oggetto, quindi questi
riferimenti a oggetto non sono "riferimenti" nel senso usato in precedenza (alias).
Per maggiori informazioni, vedere
Oggetti
e riferimenti.
Avviso
Se si assegna un riferimento ad una varibile dichiarata global
dall'interno di una funzione, il riferimento sarà visibile solo all'interno della funzione stessa.
Si può evitare tutto ciò utilizzando la matrice $GLOBALS.
Example #2 Riferimenti di varibiali globali all'interno di una funzione
<?php
$var1 = "Example variable";
$var2 = "";
function global_references($use_globals)
{
global $var1, $var2;
if (!$use_globals) {
$var2 =& $var1; // visible only inside the function
} else {
$GLOBALS["var2"] =& $var1; // visible also in global context
}
}
global_references(false);
echo "var2 is set to '$var2'\n"; // var2 is set to ''
global_references(true);
echo "var2 is set to '$var2'\n"; // var2 is set to 'Example variable'
?>
Si pensi a
global $var;
come ad una scorciatoia per
$var
=& $GLOBALS['var'];
. Quindi assegnando altri riferimenti
a
$var
si cambia soltanto il riferimento della variabile locale.
Nota:
Se si assegna un valore ad una variabile con riferimenti in una istruzione
foreach, anche la variabile a cui si fa riferimento sarà modificata.
Example #3 Riferimenti e istruzione foreach
<?php
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
// esegue qualcosa
}
echo $ref; // 3 - ultimo elemento dell'array
<?
Anche se non sono esattamente un'assegnazione per riferimento, le espressioni create
con il costrutto
array()
si possono
comportare come tali anteponendo &
all'elemento
da aggiungere. Esempio:
Si noti che i riferimenti all'interno degli array sono potenzialmente pericolosi.
Un'assegnazione normale (non per riferimento) di un riferimento nella parte destra
dell'espressione non treasforma in riferimento la variabile nella parte sinistra, ma i riferimenti
all'interno degli array sono comunque conservati in questo tipo di assegnazioni. Questo si applica
anche alle chiamate a funzione dove l'array è passato per valore. Esempio:
In altre parole, da un punto di vista dei riferimenti, il comportamento degli array è definito
elemento per elemento; il comportamento di ogni singolo elemento
è indipendente dallo stato di riferimento dell'array che lo contiene.
Passaggio per Riferimento
Il secondo utilizzo del riferimento è il passaggio di una variabile
per riferimento. Questo si fa dichiarando una variabile locale di una funzione e
una variabile nell'ambito della chiamata del riferimento con lo stesso
contenuto. Esempio:
$a assume il valore 6. Questo accade perché
nella funzione
foo, la variabile
$var si riferisce allo stesso contenuto di
$a. Si vedano le spiegazioni più dettagliate per
passaggio per
riferimento.