Ver Mensaje Individual
  #9 (permalink)  
Antiguo 31/05/2014, 12:59
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 10 meses
Puntos: 320
Respuesta: PHP hardcodea __construct() y clone() .. por que ?

Código PHP:
Ver original
  1. Class Bar { }
  2.  
  3. Class Foo
  4. {
  5.        
  6.     public function __construct()
  7.     {
  8.         global $foo;
  9.         $foo = new Bar;        
  10.     }  
  11. }
  12.  
  13.  
  14.  
  15. $foo = new Foo;
  16. debug ($foo);
  17. debug ($foo); // tampoco ahora :)

Veamos lo que hace ese codigo:

1) $foo = new Foo;

es equivalente a:

1.a) $foo = (new Foo);

por lo tanto $foo sufre estos cambios:

1) $foo = undefined (que no esta seteada)
2) Primero se resuelve la llamada al constructor de Foo
2.a) Se declara a $foo como global, como no esta definida, se le asigna null.
2.b) $foo = null;
2.c) El constructor setea la variable global con una instancia de Bar
2.d) $foo = new Bar;
3) Ahora, se resulve la igualdad, como el constructor devuelve una instancia del objeto Foo, entonces
3.a) $foo = new Foo

Se entiende porque no funciona? la asignacion esta pisando la instancia de Bar que tu asignas manualmente.

Ahora, para esto hay alternativas, la primera:

Código PHP:
Ver original
  1. <?php
  2. Class Bar { }
  3. Class Foo
  4. {        
  5.     public function __construct()
  6.     {
  7.         global $foo;
  8.         var_dump($foo);
  9.         $foo = new Bar;
  10.         var_dump($foo);        
  11.     }  
  12. }
  13. new Foo;
  14. var_dump($foo);  
  15.  
  16. //null
  17. //object(Bar)[2]
  18. //object(Bar)[2]

lo cual esta bien, perooooo, estas atado a la variable $foo, entonces, generalizando:


Código PHP:
Ver original
  1. <?php
  2. Class Bar { }
  3. Class Foo
  4. {        
  5.     public function __construct(&$foo)
  6.     {
  7.         var_dump($foo);
  8.         $foo = new Bar;
  9.         var_dump($foo);        
  10.     }  
  11. }
  12. new Foo($foo);
  13. var_dump($foo);  
  14.  
  15. //null
  16. //object(Bar)[2]
  17. //object(Bar)[2]

tienes un efecto similar
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios