¿Qué hacen las referencias?

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.

Asignar por Referencia

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;
?>
significa que $a y $b apuntan al mismo contenido.

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:

<?php
$foo 
=& find_var($bar);
?>
Desde PHP 5, new devuelve una referencia automáticamente, por lo que usar =& en este contexto es obsoleto y produce un mensaje E_DEPRECATED en PHP 5.3 y posteriores, y un mensaje E_STRICT en versiones anteriores. A partir de PHP 7.0 es sintácticamente inválido. (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.)

Advertencia

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'
?>
Piense en global $var; como simplificación de $var =& $GLOBALS['var'];. De este modo, al asignar otra referencia a $var sólo cambia la referencia de la variable local.

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(
123) 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(23);
$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! */
?>
En otras palabras, el comportamiento de las referencias de arrays está definido en una base elemento-por-elemento; el comportamiento de las referencias de elementos individuales está desasociado del estado de la referencia del array contenedor.

Pasar por 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);
?>
hará que $a sea 6. Esto sucede porque en la función foo la variable $var hace referencia al mismo contenido que $a. Para más información sobre esto, lea la sección pasar por referencia.

Devolver por Referencia

Lo tercero que hacen las referncias es devolver por referencia.