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.
En este primer caso, las referencias PHP permiten que dos variables referencien el mismo contenido. Por ejemplo:
<?php
$a =& $b;
?>
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.
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'
?>
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! */
?>
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);
?>
El tercer interés de las referencias es permitir el retorno de valores por referencia.