No hay manera de invocar
$parent->test = "hello world!";
$parent->child = new B();
y automáticamente tener una referencia a los padres en $ B.
En general, hay cuatro maneras de estructurar sus clases:
1. Agregue el objeto primario a través de Inyección, por ejemplo
class B
{
private $parent;
public function __construct($parent)
{
$this->parent = $parent;
}
public function setParent($parent)
{
$this->parent = $parent;
}
public function accessParent()
{
$this->parent->someMethodInParent();
}
}
Uso inyección de constructor cuando el objeto tiene que tener un padre cuando se crea. Esta es una relación has-a y crea un acoplamiento muy flexible. No hay dependencias codificadas en B, por lo que puede intercambiar fácilmente la instancia principal, por ejemplo con una simulación cuando UnitTesting. El uso de Dependency Injection hará que su código sea más fácil de mantener.
En el caso de uso, que le pasa a B $parent
al crear B:
$parent->child = new B($parent);
2.Uso Composición
class B
{
private $parent;
public function __construct()
{
$this->parent = new Parent;
}
public function accessParent()
{
$this->parent->someMethodInParent();
}
}
Ésta es también una tiene una relación-, pero las parejas de la clase padre a B. Tampoco es una instancia de Padres existente, sino una nueva instancia. De la redacción me resulta un tanto extraño tener un padre creado por el niño. Use esto, cuando la dependencia es una clase que no se considera que existe fuera de la clase raíz, pero es parte de todo lo que representa.
Para su UseCase, no hay forma de hacer $parent->child = new B();
y saber qué padre es cuando usa este enfoque, a menos que $ parent sea Singleton. De ser así, podría obtener la instancia de Singleton, p. Parent::getInstance()
para lograr lo que desea, pero tenga en cuenta que los Singletons no son el patrón favorito de todos, p. difícil de probar
3. Uso Herencia
class B extends Parent
{
public function accessParent()
{
$this->someMethodInParent();
}
}
De esta manera se crea un es, una relación. Todos los métodos y propiedades públicos y protegidos de la clase Parent, (pero no de una instancia específica) estarán disponibles en B y puede acceder a ellos a través de la palabra clave $this
de la instancia B.
Para su USECASE, este enfoque no funciona, ya que no tiene que tener una instancia de los padres en todo, pero B sería encapsular todo de los padres cuando se crea
$b = new B;
4. Uso de palabras clave mundial
class B extends Parent
{
private $parent;
public function __construct()
{
global $parent;
$this->parent = $parent;
}
public function accessParent()
{
$this->parent->someMethodInParent();
}
}
las importaciones de palabras clave global
variables globales en el ámbito actual. En general, you should avoid using the global keyword en un contexto OO, pero utilice uno de los otros tres métodos anteriores, preferiblemente el primero. Si bien es una función de idioma, está mal visto, aunque es la siguiente más cercana a la primera, p.
$parent->child = new B();
De todos modos, espero que ayude.
es sólo dos objetos con referencias a la otra. puedes llamarlos padre e hijo. – Anurag
¿Por qué necesita que el niño tenga una referencia a sus padres? ¿Hay algo en el padre que el niño necesita acceso también? Si es así, es mejor que le entregues al niño todo lo que pueda necesitar en lugar de intentar obtenerlo del padre. – rojoca
Tengo en el padre un "objeto de privacidad", luego algunas variables que necesito en el niño, y pasarlas a todas sería tedioso ... – AntonioCorrenti