sizin sınıfları yapısı dört yolu vardır,
Genellikle B'deki $ ebeveyne bir başvuru var otomatik
$parent->test = "hello world!";
$parent->child = new B();
çağırmak ve hiçbir yolu yoktur 1. Ebeveyn nesnesini Enjeksiyon ile toplayın, örn. nesne oluşturulduğu zaman bir ebeveyni olması gerekiyor
class B
{
private $parent;
public function __construct($parent)
{
$this->parent = $parent;
}
public function setParent($parent)
{
$this->parent = $parent;
}
public function accessParent()
{
$this->parent->someMethodInParent();
}
}
kullanın yapıcı enjeksiyonu. Bu, numaralı ilişkisindedir ve çok gevşek bir bağlantı oluşturur. B'de kodlanmış bağımlılıklar yoktur, bu nedenle, örneğin bir Test Testini yaptığınızda bir Mock ile Ana Örneğini kolayca değiştirebilirsiniz. Bağımlılık Enjeksiyonunu Kullanma, kodunuzu daha iyi hale getirecektir. senin Usecase olarak
, sen B oluştururken B'ye $parent
geçerdi:
$parent->child = new B($parent);
2.Bu aynı zamanda bir olduğunu
class B
{
private $parent;
public function __construct()
{
$this->parent = new Parent;
}
public function accessParent()
{
$this->parent->someMethodInParent();
}
}
Kullanım Kompozisyon ilişkisi-a vardır, ancak B noktasına çiftler Veli sınıfı Aynı zamanda değil, varolan Veli örneği, ancak yeni bir örneği bu. İfadeden, çocuğun yarattığı bir ebeveyne sahip olmak biraz garip geliyor. Bağımlılık, kök sınıfın dışında var sayılmayan, ancak temsil ettiği tüm şeyin parçası olan bir sınıf olduğunda bunu kullanın.
UseCase'iniz için, $parent->child = new B();
yapmanın hiçbir yolu yoktur ve $ parent'in bir Singleton olmadığı sürece, bu yaklaşımı kullanırken hangi üst öğenin olduğunu bilir. Eğer öyleyse, Singleton örneğini alabilirsiniz, ör. İstediğinizi elde etmek için Parent::getInstance()
, ancak Singleton'un herkesin favori şekli olmadığını unutmayın. test etmek zor. Bir oluşturmak
3. Kullanım Kalıtım
class B extends Parent
{
public function accessParent()
{
$this->someMethodInParent();
}
}
Bu yoludur-a ilişkisi. Tüm genel ve korunan yöntem ve özellikleri, Ana sınıftan (ancak belirli bir örnek değil) B'de kullanılabilir ve bunlara, B örneğinin $this
anahtar sözcüğü aracılığıyla erişebilirsiniz. Eğer hiç Ana örneğini olması gerekmez gibi USECASE
, bu yaklaşım, çalışmıyor, ancak
$b = new B;
4. Kullan oluşturulduğu zaman B Veli şeyi kapsülleyen geçerli kapsamdaki içine küresel anahtar kelime
class B extends Parent
{
private $parent;
public function __construct()
{
global $parent;
$this->parent = $parent;
}
public function accessParent()
{
$this->parent->someMethodInParent();
}
}
global
kelime ithalatı küresel değişkenleri. Genel olarak bir OO bağlamında you should avoid using the global keyword, ancak yukarıdaki diğer üç yöntemden birini, tercihen birinci olanı kullanın. Bu bir dil özelliği olsa da, birincisi için en yakın şey olsa da, -
$parent->child = new B();
Yine de, umarım yardımcı olur.
o birbirlerine referanslarla sadece iki nesne var. onlara ebeveyn ve çocuk diyebilirsiniz. – Anurag
Ailenin referansını almak için çocuğa neden ihtiyaç duyuyorsunuz? Ebeveynte çocuğun da erişime ihtiyacı olduğu bir şey var mı? Eğer öyleyse, çocuğa, ebeveyninden almayı denemek yerine, ihtiyaç duyabileceği her şeyi iletmek daha iyidir. – rojoca
Ebeveynte bir "gizlilik nesnesi" var, sonra çocuğa ihtiyaç duyduğum bazı değişkenler ve bunların hepsini geçmek yorucu olurdu ... – AntonioCorrenti