Nie ma sposobu, aby wywołać
$parent->test = "hello world!";
$parent->child = new B();
i automatycznie mają odniesienie do $ rodzica w B.
Generalnie istnieją cztery sposoby, aby zbudować swoje zajęcia:
1. Agreguj obiekt nadrzędny poprzez Injection, np.
class B
{
private $parent;
public function __construct($parent)
{
$this->parent = $parent;
}
public function setParent($parent)
{
$this->parent = $parent;
}
public function accessParent()
{
$this->parent->someMethodInParent();
}
}
Zastosowanie wtrysku konstruktor, gdy obiekt ma mieć rodzica, gdy jest tworzony. Jest to relacja ma- i tworzy bardzo luźne połączenie. W B nie ma żadnych ściśle zakodowanych zależności, więc można łatwo zamienić instancję nadrzędną, na przykład z próbą, gdy UnitTest. Używanie Dependency Injection spowoduje, że Twój kod będzie łatwiejszy w utrzymaniu.
W swojej USECASE, chcesz przekazać $parent
do B podczas tworzenia B:
$parent->child = new B($parent);
2.Zastosowanie Skład
class B
{
private $parent;
public function __construct()
{
$this->parent = new Parent;
}
public function accessParent()
{
$this->parent->someMethodInParent();
}
}
Jest to również ma-relację, ale pary klasy nadrzędnej do B. To również nie istniejąca instancja nadrzędna, ale nowa instancja. Ze sformułowania uważam, że to trochę dziwne, aby mieć rodzica stworzonego przez dziecko. Użyj tego, gdy zależność jest klasą, która nie jest uważana za istniejącą poza klasą root, ale jest częścią całej rzeczy, którą reprezentuje.
Dla Twojego UseCase, nie ma sposobu, aby zrobić $parent->child = new B();
i wiedzieć, co rodzic jest przy użyciu tego podejścia, chyba że $ rodzic jest Singleton. Jeśli tak, możesz uzyskać instancję Singleton, np. Parent::getInstance()
, aby osiągnąć to, co chcesz, ale pamiętaj, że Singletony nie są ulubionym wzorem dla wszystkich, np. trudne do przetestowania.
3. Zastosowanie Dziedziczenie
class B extends Parent
{
public function accessParent()
{
$this->someMethodInParent();
}
}
W ten sposób można stworzyć oznacza związek. Wszystkie publiczne i chronione metody i właściwości z klasy nadrzędnej (ale nie określonej instancji) będą dostępne w języku B i będzie można uzyskać do nich dostęp za pomocą słowa kluczowego $this
instancji B.
Dla USECASE, takie podejście nie działa, jak nie mieć wystąpienie Dominującej w ogóle, ale B by upakować wszystko rodzica, kiedy to utworzony
$b = new B;
4. Zastosowanie globalny słów kluczowych
class B extends Parent
{
private $parent;
public function __construct()
{
global $parent;
$this->parent = $parent;
}
public function accessParent()
{
$this->parent->someMethodInParent();
}
}
w global
słów kluczowych import zmiennych globalnych do bieżącego zakresu. Ogólnie rzecz biorąc, you should avoid using the global keyword w kontekście OO, ale użyj jednej z trzech pozostałych metod powyżej, najlepiej pierwszej. Mimo że jest to funkcja językowa, jest niezadowolona - mimo że jest to kolejna pozycja najbliższa pierwszej, np.
$parent->child = new B();
W każdym razie, mam nadzieję, że pomaga.
to tylko dwa obiekty z odniesieniami do siebie. możesz nazwać je rodzicem i dzieckiem. – Anurag
Dlaczego potrzebujesz, aby dziecko miało referencję do rodzica? Czy jest coś w rodzicu, że dziecko też potrzebuje dostępu? Jeśli tak, lepiej przekazać dziecku wszystko, czego może potrzebować, a nie próbować uzyskać od rodzica. – rojoca
Mam w rodzicu "obiekt prywatności", to niektóre zmienne potrzebuję w dziecku, a przekazanie ich wszystkich byłoby nudne ... – AntonioCorrenti