Hay tres operaciones básicas que se realizan usando referencias: asignar por referencia, pasar por referencia, y devolver por referencia. En esta sección se dará una introducción a estas operaciones, con enlaces para una lectura complementaria.
En la primera de estas operaciones, las referencias de PHP permiten hacer que dos variables hagan referencia al mismo contenido. Es decir, cuando se hace:
<?php
$a =& $b;
?>
Nota:
$a y $b aquí son completamente iguales. $a no está apuntando a $b o viceversa. $a y $b están apuntando al mismo lugar.
Nota:
Si se asigna, pasa, o devuelve una variable no definida por referencia, la variable se creará.
Ejemplo #1 Usar referencias con variables no definidas
<?php
function foo(&$var) { }
foo($a); // $a es "creada" y asignada a 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)
?>
Se puede usar la misma sintaxis con funciones que devuelven referencias y con el operador new (desde PHP 4.0.4 y anterior a PHP 5.0.0):
<?php
$foo =& find_var($bar);
?>
E_DEPRECATED
en PHP 5.3 y
posteriores, y un mensaje E_STRICT
en versiones anteriores.
(Técnicamente, la diferencia es que, en PHP 5, las variables de objetos, como
los recursos, son meros punteros a la información del objeto actual, por lo que estas referencias
a objetos no son "referencias" en el mismo sentido usado antes (alias).
Para más información, véase Objetos
y referencias.)
Si se asigna una referencia a una varible declarada global dentro de una función, la referencia será visible sólo dentro de la función. Se puede evitar esto usando la matriz $GLOBALS.
Ejemplo #2 Refenciar variables globales dentro de funciones
<?php
$var1 = "Variable de ejemplo";
$var2 = "";
function referencias_globales($usar_globals)
{
global $var1, $var2;
if (!$usar_globals) {
$var2 =& $var1; // visible sólo dentro de la función
} else {
$GLOBALS["var2"] =& $var1; // visible también en el contexto global
}
}
referencias_globales(false);
echo "var2 está establecida a '$var2'\n"; // var2 está establecida a ''
referencias_globales(true);
echo "var2 está establecida a '$var2'\n"; // var2 está establecida a 'Variable de ejemplo'
?>
Nota:
Si se asigna un valor a una variable con referencias en una sentencia foreach, también se modifican las referencias.
Ejemplo #3 Referencias y la sentencia foreach
<?php
$ref = 0;
$fila =& $ref;
foreach (array(1, 2, 3) as $fila) {
// hacer algo
}
echo $ref; // 3 - último elemento de la matriz iterada
?>
Mientras que no sea estrictamente una asignación por referencia, las expresiones creadas con el constructor de lenguaje array() también pueden comportarse como tales prefijando & al elemento del array a añadir. Ejemplo:
<?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); */
?>
Observe, sin embargo, que las referencias dentro de arrays son potencialmente peligrosas. Realizar una asignación normal (no por referencia) con una referencia en el lado derecho no convierte el lado izquierdo en una referencia, pero las referencias dentro de arrays son conservadas en estas asignaciones normales. Esto también se aplica a las llamadas a funciones donde el array es pasado por valor. Ejemplo:
<?php
/* Asignación de variables escalares */
$a = 1;
$b =& $a;
$c = $b;
$c = 7; //$c no es una referencia; no cambia $a o $b
/* Asignación de variables de array */
$arr = array(1);
$a =& $arr[0]; // $a y $arr[0] son el mismo conjunto de referencias
$arr2 = $arr; // ¡no es una asignación por referencia!
$arr2[0]++;
/* $a == 2, $arr == array(2) */
/* ¡El contenido de $arr se cambia incluso si no es una referencia! */
?>
Lo segundo que hacen las referencias es pasar variables por referencia. Esto se lleva a cabo haciendo que una variable local en una función y una variable en el ámbito de la llamada referencien al mismo contenido. Ejemplo:
<?php
function foo(&$var)
{
$var++;
}
$a=5;
foo($a);
?>
Lo tercero que hacen las referncias es devolver por referencia.