Çağırmak için hiçbir yolu yoktur
$parent->test = "hello world!";
$parent->child = new B();
ve otomatik olarak B'deki $ üst başvuru var
Genellikle, sınıfları yapısı için dört yolu vardır:
1. Aggregate the parent object via Injection, e.g.
class B
{
private $parent;
public function __construct($parent)
{
$this->parent = $parent;
}
public function setParent($parent)
{
$this->parent = $parent;
}
public function accessParent()
{
$this->parent->someMethodInParent();
}
}
Nesne oluşturulduktan zaman bir ebeveyne sahip zorunda kaldığında yapıcı enjeksiyon kullanın. Bu has-a ilişki olduğunu ve bir çok gevşek bir bağlantı oluşturur. Orada B hiçbir kodlanmış bağımlılıkları, bu nedenle kolayca Mock unittesting ile örneğin, Veli örneğini takas edebilirsiniz. Dependency Injection kullanarak kod daha rahat yapacaktır.
Senin usecase olarak, B oluştururken $parent
B'ye geçmek istiyorum:
$parent->child = new B($parent);
2. Use Composition
class B
{
private $parent;
public function __construct()
{
$this->parent = new Parent;
}
public function accessParent()
{
$this->parent->someMethodInParent();
}
}
Bu aynı zamanda bir has-a ilişki, ancak çiftler aynı zamanda varolan Veli örneği değil B. Veli sınıf, ama yeni bir örneği. Ifadeler itibaren ben bir ebeveyn çocuk tarafından oluşturulan olması biraz tuhaf buluyorum. Bağımlılık kök sınıfın dışında var kabul edilmez bir sınıf olduğunu, ama onu temsil olayın bir parçası olduğunda, bu kullanın.
$ Ebeveyn bir Singleton olduğu sürece usecase için, orada $parent->child = new B();
yapmanın bir yolu yoktur ve bu yaklaşımı kullanırken ne ebeveyn biliyorum. Eğer öyleyse, Singleton örneği alabilir, örneğin Parent::getInstance()
ne istediğinizi elde, ama Singletons herkesin favori desen, örneğin olmadığını unutmayın test etmek zor.
3. Use Inheritance
class B extends Parent
{
public function accessParent()
{
$this->someMethodInParent();
}
}
Bir is-a ilişkisi oluşturmak Bu şekilde. Ana sınıfında, (ancak belirli bir örneğinin) tüm kamu ve korumalı yöntemleri ve özellikleri B mevcut olacak ve B örneğinin $this
anahtar kelime kullanarak erişebilirsiniz.
Lütfen usecase için, tüm Veli bir örneğini olması gerekmez gibi bu yaklaşım, çalışmıyor, ancak oluşturulan olduğunda B Veli şeyi kapsülleyen
$b = new B;
4. Use global keyword
class B extends Parent
{
private $parent;
public function __construct()
{
global $parent;
$this->parent = $parent;
}
public function accessParent()
{
$this->parent->someMethodInParent();
}
}
Geçerli kapsam içine global
anahtar kelime ithalatı global değişkenler. Genel olarak, you should avoid using the global keyword OO bağlamda, ancak yukarıdaki diğer üç yöntemden birini, tercihen birinci birini kullanabilirsiniz. Bir dil bir özellik olsa da, bunun üzerine kaşlarını çattı - nasıl ilkine sonraki en yakın şey, örneğin olmasına rağmen
$parent->child = new B();
Her neyse, bu yardımcı olur umarım.