Devolver referencias

Devolver referencias es útil cuando se quiere utilizar una función para determinar a qué variable debe estar ligada una referencia. No utilice no el retorno por referencia para mejorar el rendimiento, el motor es suficientemente robusto para optimizar esto internamente. Devuelva referencias solo cuando haya buenas razones técnicas para hacerlo. Para devolver referencias, utilice esta sintaxis:

<?php

class Foo
{
public
$value = 42;

public function &
getValue()
{
return
$this->value;
}
}

$obj = new Foo();
$myValue = &$obj->getValue(); // $myValue es una referencia de $obj->value, que vale 42.
$obj->value = 2;
echo
$myValue; // muestra el nuevo valor de $obj->value, es decir, 2.

?>
En este ejemplo, se asigna un valor a la propiedad del objeto devuelta por la función getValue, y no a su copia, como sería el caso si no se hubiera utilizado la sintaxis de referencia.

Nota: A diferencia del paso de parámetro, aquí, se debe utilizar & en ambos lugares, tanto para indicar que se devuelve por referencia (no por copia), como para indicar que también se asigna por referencia (no por copia tampoco) para la variable $myValue.

Nota: Si se intenta devolver una referencia desde una función con la sintaxis: return ($this->value);, esto no funcionará no como se espera, y devolverá el resultado de la expresión, y no de la variable, por referencia. Solo se pueden devolver variables por referencia desde una función, y nada más.

Para utilizar la referencia devuelta, se debe utilizar la asignación por referencia:

<?php

function &collector()
{
static
$collection = array();
return
$collection;
}

$collection = &collector();
// Ahora, la variable $collection es una variable por referencia que referencia el array static dentro de la función

$collection[] = 'foo';

print_r(collector());
// Array
// (
// [0] => foo
// )

?>

Nota: Si la asignación se realiza sin el símbolo &, por ejemplo $collection = collector();, la variable $collection recibirá una copia del valor, y no la referencia devuelta por la función.

Para pasar la referencia devuelta a otra función que espera una referencia, se puede utilizar la siguiente sintaxis:
<?php

function &collector()
{
static
$collection = array();
return
$collection;
}

array_push(collector(), 'foo');

?>

Nota: Note que array_push(&collector(), 'foo'); no funcionará, y resultará en un error fatal.