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.
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;
?>
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);
?>
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.
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'
?>
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:
<?php
$a = 1;
$b = array(2, 3);
$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! */
?>
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);
?>
Il terzo utilizzo del riferimento è il ritorno per riferimento.