Código PHP:
Ver originalClass Bar { }
Class Foo
{
public function __construct()
{
global $foo;
$foo = new Bar;
}
}
$foo = new Foo;
debug ($foo);
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<?php
Class Bar { }
Class Foo
{
public function __construct()
{
global $foo;
$foo = new Bar;
}
}
new Foo;
//null
//object(Bar)[2]
//object(Bar)[2]
lo cual esta bien, perooooo, estas atado a la variable $foo, entonces, generalizando:
Código PHP:
Ver original<?php
Class Bar { }
Class Foo
{
public function __construct(&$foo)
{
$foo = new Bar;
}
}
new Foo($foo);
//null
//object(Bar)[2]
//object(Bar)[2]
tienes un efecto similar