I riferimenti permettono di creare due o più variabili che si riferiscono 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 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):
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.
Avvertimento |
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.
Esempio 21-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.
Esempio 21-2. 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 ?>
|
|
Avvertimento |
Spesso le matrici complesse sono copiate che referenziate. Il seguente
esempio non gira come atteso.
Esempio 21-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:
$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.