Hola:
La utilidad del retorno por referencia es más clara cuando se manejan objetos y no variables simples.
Te pongo un ejemplo:
Código PHP:
<?php
class A{
var $nombre = "porDefecto";
}
class B{
var $componenteDeB;
function B(&$comp){//constructor
$this->componenteDeB = &$comp;
}
function cambiarNombreDeComponenteDeB($nuevoNombre){
$componente = &$this->componenteDeB;
$componente->nombre = $nuevoNombre;
}
function & obtenerComponenteDeB(){
return $this->componenteDeB;
}
function obtenerNombreDeComponenteDeB(){
$componente = $this->componenteDeB;
return $componente->nombre;
}
}
class C{
var $componenteDeC;
function C(&$comp){//constructor
$this->componenteDeC = &$comp;
}
function cambiarNombreDeComponenteDeC($nuevoNombre){
$componente = &$this->componenteDeC;
$componente->nombre = $nuevoNombre;
}
}
// Creamos un objeto B, pasando como parámetro un nuevo objeto A como componente:
$objetoB = new B(new A);
// Cambiamos el nombre de su componente:
$objetoB->cambiarNombreDeComponenteDeB('nombre1');
// Ahora creamos un objeto C pero queremos que comparta la componente con B:
// O sea, le pasamos como parámetro la componente de B, pero será una referencia, ya que ese método obtenerComponenteDeB() está declarado para que devuelva una referencia.
$objetoC = new C($objetoB->obtenerComponenteDeB());
// Cambiamos el nombre de su componente:
$objetoC->cambiarNombreDeComponenteDeC('nombre2');
// Vemos cuál es el valor del nombre en la componente de B
echo $objetoB->obtenerNombreDeComponenteDeB();// esto imprime 'nombre2'
?>
Mira todo el manejo de referencias y espero que tengas muchas preguntas.
Lo que no se debe hacer es:
- Si queremos que "unaFuncion()" maneje una referencia de $variable como parámetro:
Código PHP:
// INCORRECTO
function unaFuncion($unParametro){
// acciones
}
unaFuncion(&$variable);
Código PHP:
// CORRECTO
function unaFuncion(&$unParametro){
// acciones
}
unaFuncion($variable);
Saludos