Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: madpitbull_99 en 4 Junio 2011, 00:01 am



Título: Referencias en PHP
Publicado por: madpitbull_99 en 4 Junio 2011, 00:01 am
Algunos de los que hayan leído sobre este tema, seguramente habrán confundido las referencias con los punteros de C/C++. En realidad no es así, mientras que los punteros apuntan a una dirección de memoria específica, las referencias le están diciendo al interprete de PHP que vamos a usar el contenido de una variable con diferentes nombres.

Veamos un ejemplo:

Código
  1. <?php
  2.    $var1 = "valor";
  3.    $var2 =& $var1;
  4.  
  5.    echo $var2; //imprime: valor
  6. ?>
  7.  

Como vemos, la variable $var1 contiene la cadena "valor", en el siguiente caso la variable $var2 apunta al contenido/valor de la variable $var1. Por lo que, si cambiamos el valor de $var2 también cambiará el de $var1.

Código
  1. <?php
  2.    $var1 = "valor";
  3.    $var2 =& $var1;
  4.  
  5.    $var2 = "nuevo valor";
  6.    echo $var1;//imprime: nuevo valor
  7. ?>
  8.  

La mayoría de los programadores PHP emplean las referencias en OOP para ahorrar recursos. Otro ejemplo para comprender las referencias usando valores numéricos, es el siguiente:

Código
  1. <?php
  2.    $b=5; $d=7;
  3.    $a =& $b;
  4.    $c =& $d;
  5.    //Ahora: a=b=5; c=d=7;
  6.    $b =& $c;
  7.    //Ahora: a=5, b=c=d=7;
  8. ?>
  9.  

Esto no se limita aquí, se puede pasar parámetros por referencia, devolver referencias, destruirlas y ubicarlas. Un claro ejemplo de como devolver referencias es el de abajo:

Código
  1. <?php
  2.    class foo {
  3.        public $valor = 42;
  4.  
  5.        public function &obtenerValor() {
  6.            return $this->valor;
  7.        }
  8.    }
  9.  
  10.    $obj = new foo;
  11.    $miValor = &$obj->obtenerValor();
  12.    // $miValor es una referencia a $obj->valor, que es 42.
  13.    $obj->valor = 2;
  14.    echo $miValor;
  15.    // imprime el nuevo valor de $obj->valor, esto es, 2.
  16. ?>
  17.  

Para destruir una referencias se utiliza la función unset($referencia). Actualmente no son muy empleadas, pero si algunas vez os las encontráis en algún código, sabréis cuál es su uso.

Para más información os recomiendo leer el apartado de referencias (http://www.php.net/manual/es/language.references.php) de php.net.