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:
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:
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(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:
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:
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:
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.