Spiegazioni sui riferimenti
PHP Manual

Che cosa fanno i riferimenti

Esistono tre operazioni principali effettuate attraverso i riferimenti: assegnare per riferimento, passare per riferimento, e restituzione per riferimento. Questa sezione darà un'introduzione a queste operazioni, con collegamenti per ulteriori informazioni.

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:

<?php
$a 
=& $b;
?>
$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):

<?php
$foo 
=& find_var($bar);
?>
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(
123) 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:

<?php
$a 
1;
$b = array(23);
$arr = array(&$a, &$b[0], &$b[1]);
$arr[0]++; $arr[1]++; $arr[2]++;
/* $a == 2, $b == array(3, 4); */
?>

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:

<?php
/* Assegnazione di variabili scalari */
$a 1;
$b =& $a;
$c $b;
$c 7//$c non è un riferimento; nessun cambiamento in $a o $b

/* Assegnazione di variabili array */
$arr = array(1);
$a =& $arr[0]; //$a e $arr[0] sono nello stesso insieme di riferimento
$arr2 $arr//non è un'assegnazione per riferimento!
$arr2[0]++;
/* $a == 2, $arr == array(2) */
/* Il contenuto di $arr è modificato anche se non è un riferimento! */
?>
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:

<?php
function foo(&$var)
{
    
$var++;
}

$a=5;
foo($a);
?>
$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.

Restituzione per Riferimento

Il terzo utilizzo del riferimento è il ritorno per riferimento.


Spiegazioni sui riferimenti
PHP Manual