¿Qué hacen las referencias?

Existen tres principales usos de las referencias: la asignación por referencia, el paso por referencia y el retorno por referencia. Esta sección introducirá estas operaciones, con enlaces a más detalles.

Asignación por referencia

En este primer caso, las referencias PHP permiten que dos variables referencien el mismo contenido. Por ejemplo:

<?php

$a
=& $b;

?>
Esta escritura indica que $a y $b apuntan al mismo contenido.

Nota:

$a y $b son completamente iguales aquí: no es $a quien apunta a $b, o viceversa. Son $a y $b quienes apuntan al mismo contenido.

Nota:

Si se asigna, pasa o devuelve una variable indefinida por referencia, se creará automáticamente.

Ejemplo #1 Uso de referencias con variables indefinidas

<?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)

?>

La misma sintaxis puede ser utilizada con las funciones que devuelven referencias:

<?php

$foo
=& find_var($bar);

?>

Utilizar la misma sintaxis con una función que no devuelve por referencia generará un error, al igual que utilizarla con el resultado del operador new. Aunque los objetos se pasan como punteros, esto no es idéntico a las referencias como se explica en la sección los Objetos y referencias.

Advertencia

Si se asigna una referencia a una variable declarada como global en una función, la referencia solo será visible dentro de la función. Se puede evitar esto utilizando el array $GLOBALS.

Ejemplo #2 Referenciar variables globales desde funciones

<?php

$var1
= "Variable Ejemplo";
$var2 = "";

function
global_references($use_globals)
{
global
$var1, $var2;

if (!
$use_globals) {
$var2 =& $var1; // visible solo en la función
} else {
$GLOBALS["var2"] =& $var1; // visible también en el contexto global
}
}

global_references(false);
echo
"var2 está definido como '$var2'\n"; // var2 está definido como ''

global_references(true);
echo
"var2 está definido como '$var2'\n"; // var2 está definido como 'Variable Ejemplo'

?>
Vea global $var; como un atajo para $var =& $GLOBALS['var'];. Por lo tanto, asignar otra referencia a $var solo modifica la referencia local de la variable.

Nota:

Si se asigna un valor a una variable que tiene referencias en una estructura foreach, las referencias también serán modificadas.

Ejemplo #3 Referencias y estructura foreach

<?php

$ref
= 0;
$row =& $ref;

foreach (array(
1, 2, 3) as $row) {
// hacer algo
}

echo
$ref; // 3 - el último elemento del array iterado

?>

Aunque no es estrictamente una asignación por referencia, las expresiones creadas con la estructura de lenguaje array() pueden también comportarse como tales, prefijando con & el elemento del array. Aquí hay un 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); */

?>

Note que las referencias dentro de los arrays pueden resultar peligrosas. Utilizar una asignación normal (no por referencia) con una referencia a la derecha del operador no transforma la parte izquierda de la asignación en referencia, pero las referencias dentro de los arrays son preservadas. Esto se aplica también a las llamadas de funciones con un array pasado por valor. Ejemplo:

<?php

/* Asignación de variables escalares */
$a = 1;
$b =& $a;
$c = $b;
$c = 7; // $c no es una referencia; no hay cambio en $a o $b

/* Asignación de variables de tipo array */
$arr = array(1);
$a =& $arr[0]; // $a y $arr[0] son referencias al mismo valor
$arr2 = $arr; // NO es una asignación por referencia!
$arr2[0]++;
/* $a == 2, $arr == array(2) */
/* ¡Los contenidos de $arr son cambiados aunque no fuera una referencia! */

?>
En otras palabras, desde el punto de vista de las referencias, el comportamiento de los arrays está definido elemento por elemento; el comportamiento de cada elemento es independiente del estado de referencia del array que los contiene.

Paso por referencia

El segundo interés de las referencias es permitir pasar variables por referencia. Esto se realiza haciendo referenciar el mismo contenido por una variable local a una función y por una variable del contexto llamante. Por ejemplo:

<?php

function foo(&$var) {
$var++;
}
$a=5;
foo($a);

?>
Después de la ejecución de esta porción de código, $a vale 6. Esto se debe a que, en la función foo, la variable $var apunta al mismo contenido que $a. Para más información sobre este tema, se puede consultar la sección paso por referencia.

Retorno por referencia

El tercer interés de las referencias es permitir el retorno de valores por referencia.