¿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);
?>
Usar la misma sintaxis con una función que no devuelve por referencia generará un error, al igual que usarla con el resultado del operador new. Aunque los objetos se manejan como punteros, estos no son lo mismo que las referencias, como se explica en 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
global_references($use_globals)
{
global
$var1, $var2;
if (!
$use_globals) {
$var2 =& $var1; // visible sólo dentro de la función
} else {
$GLOBALS["var2"] =& $var1; // visible también en el contexto global
}
}

global_references(false);
echo
"var2 está establecida a '$var2'\n"; // var2 está establecida a ''
global_references(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;
$row =& $ref;
foreach (array(
1, 2, 3) as $row) {
// hacer algo
}
echo
$ref; // 3 - último elemento del array iterado
?>

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! */

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