Devolver Referencias

Devolver por referencia es útil cuando se quiere usar una función para encontrar a qué variable debería estar vinculada una referencia. No use devolver por referencia para aumentar el rendimiento. El motor optimizará automáticamente esto por sí mismo. Hay que devolver referencias sólo cuando se tenga una razón técnicamente válida para hacerlo. Para devolver referencias use esta sintaxis:

<?php
class foo {
    public 
$valor 42;

    public function &
obtenerValor() {
        return 
$this->valor;
    }
}

$obj = new foo;
$miValor = &$obj->obtenerValor(); // $miValor es una referencia a $obj->valor, que es 42.
$obj->valor 2;
echo 
$miValor;                // imprime el nuevo valor de $obj->valor, esto es, 2.
?>
En este ejemplo, la propiedad del objeto devuelto por la función obtenerValor debería estar establecida, no la copia, como si estuviera sin usar la sintaxis de referencia.

Nota: A diferencia de pasar un parámetro, aquí se tiene que usar & en ambos lugares - para indicar que se quiere devolver por referencia, no una copia, y para indicar que la vinculación por referencia, en vez de la asignación normal, debería ser hecha para $miValor.

Nota: Si se intenta devolver una referencia desde una función con la sintaxis: return ($this->valor);, no funcionará ya que se está intentando devolver el resultado de una expresión, y no de una variable, por referencia. Sólo se puede devolver variables por referencia desde una función - nada más. Desde PHP 5.1.0, se emite un error E_NOTICE si el código intenta devolver una expresión dinámica o un resultado del operador new.

Para usar la referencia retornada, se debe usar la asignación por referencia:

<?php
function &collector() {
  static 
$collection = array();
  return 
$collection;
}
$collection = &collector();
$collection[] = 'foo';
?>
Para pasar la referencia retornada a otra función que espera una referencia se puede usar la siguiente sintaxis:
<?php
function &collector() {
  static 
$collection = array();
  return 
$collection;
}
array_push(collector(), 'foo');
?>

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