Forum und email

Che cosa fanno i riferimenti

I riferimenti permettono di creare due o più variabili che si riferiscono 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 copia una matrice contenete dei riferimenti, i valori non sono dereferenziati. Questo vale anche per le matrici passate per valore alle funzioni.

Questa sintassi si può usare con le funzioni, nella restituzione per riferimento, e con l'operatore new (da PHP 4.0.4 in poi):

<?php
$bar 
=& new fooclass();
$foo =& find_var($bar);
?>

Nota: Se non si usa l'operatore & l'oggeto appena creato viene copiato. Usando $this in una classe, opererà sulla sua istanza corrente. L'assegnazione senza & copia perciò l'istanza (l'oggetto) e $this opera sulla copia, che non è sempre ciò che si desidera. Normalmente si lavora su una singola istanza di oggetto, sia per motivi di prestazioni che di consumo di memoria.
Utilizzando l'operatore @ con new, si sopprimono gli errori nel costruttore in questo modo @new, il metodo però non funziona se si usa l'istruzione &new. Questa è una limitazione dello Zend Engine e provoca un parser error.

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#1 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#2 Riferimenti e istruzione foreach

<?php
$ref 
0;
$row =& $ref;
foreach (array(
123) as $row) {
    
// esegue qualcosa
}
echo 
$ref// 3 - ultimo elemento dell'array
?>

Avviso

Spesso le matrici complesse sono copiate che referenziate. Il seguente esempio non gira come atteso.

Example#3 Riferimenti con matrici complesse

<?php
$top 
= array(
    
'A' => array(),
    
'B' => array(
        
'B_b' => array(),
    ),
);
 
$top['A']['parent'] = &$top;
$top['B']['parent'] = &$top;
$top['B']['B_b']['data'] = 'test';
print_r($top['A']['parent']['B']['B_b']); // array()
?>

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.

Il terzo utilizzo del riferimento è il ritorno per riferimento.