Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Instanciar clases con o sin ampersand (& )

Estas en el tema de Instanciar clases con o sin ampersand (& ) en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Que diferencia hay entre esto: $xajax = new xajax(); y esto: $xajax =& new xajax(); Hasta donde yo se, el ampersand se usar por ej. ...
  #1 (permalink)  
Antiguo 23/07/2006, 21:06
 
Fecha de Ingreso: mayo-2005
Mensajes: 3
Antigüedad: 18 años, 11 meses
Puntos: 0
Instanciar clases con o sin ampersand (& )

Que diferencia hay entre esto:
$xajax = new xajax();

y esto:
$xajax =& new xajax();

Hasta donde yo se, el ampersand se usar por ej. para pasar un argumento por refrencia en vez de hacerlo por valor, pero cual es el objetivo de usarlo en una instanciación?
¿cual es mejor?

Gracias.-
  #2 (permalink)  
Antiguo 23/07/2006, 22:09
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Bueno... eliminé por error el post que había puesto aquí... así que ahora repito algo de lo que puse.

No es que tenga que ser bueno o malo... depende de la situación. A veces es necesario.

Te puedo poner un ejemplo de cuándo se puede necesitar instanciar por referencia. Supongamos que una clase necesita conservar una referencia de otro objeto o variable:
Código PHP:
$mi_objeto 0;

class 
UnaClase{
    var 
$_obj//  Acá guardamos una referencia de un objeto que esta clase necesita.
    
function UnaClase(&$obj){ // fíjate que tomo el parámetro por referencia
        
$this->_obj =& $obj// asigno también por referencia
    
}
}

// Supongamos que tengo una variable "$mi_objeto" que necesito pasar siempre por referencia.

$instancia_valor = new UnaClase($mi_objeto);
$instancia_referencia =& new UnaClase($mi_objeto);

for(
$i=1;$i<=5;$i++){
    
$mi_objeto++;
    echo 
'La variable $mi_objeto vale : '.$instancia_valor->_obj;
    echo 
'<br />';    
    echo 
'En la instancia por valor el obj vale : '.$instancia_valor->_obj;
    echo 
'<br />';
    echo 
'En la instancia por referencia el obj vale : '.$instancia_referencia->_obj;
    echo 
'<hr />';

Como verás, si queríamos manejar una instancia de $mi_objeto tenemos que instanciar por referencia.

Saludos
  #3 (permalink)  
Antiguo 24/07/2006, 12:14
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Mmmm .... depende el contexto:

Si es PHP4, por defecto todo es pasado "por valor" y si tu quieres que pase "por referencia" (es decir, siempre enviar y usar el mismo objeto real) deberás decirlo de manera explícita.

Si es PHP5, esto cambió. Ahora los objetos son todos pasados "por referencia" (siempre), lo cual no debería ser necesario hacerlo de forma explícita (haciendo uso del &).

Nota: los objetos, no todas las variables. Si pasas una variable, esta sigue pasando "por valor" sin importar la versión de PHP, lo cual deberás hacer uso del & para decirle que es una referencia.

Definición: piensa en "por referencia" como un puntero de memoria que apunta a la misma variable siempre, y "por valor", copias de la misma, o sea, nuevas variables con el mismo valor. Si lo haces por referencia, y modificas sus valores, el resto que reciba esa variable conservarán el valor anterior. De lo contrario, cada vez que pasas la variable, solo pasas el "valor" (como dice la palabra), no manteniéndose los cambios que hagas si lo recibe otro.

¿Si es mejor? Bueno, si así lo hacen los lenguajes OO y PHP5 lo copió, debe ser bueno que así sea

PD: lee este capítulo del manual de PHP, que tal vez te aclare un poco más: Capítulo 21. Explicando las Referencias
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:33.