Tahmindi, ama tüm alt sınıflar için (ana sınıfı) bağımlılık enjeksiyonu ile bir ana sınıfı için Singleton, ve fabrika / Singleton kullanın. Bu şekilde alt sınıfları bile birincil sınıfının bir örneği için geçerli bir referans olmadan yük olmaz.
EDIT: Bu yanıt kabul edildi beri ben gelecek okuyucuların yararına, bir örnek vermeye karar verdik. Ayrıca, nihai olarak tüm sınıfların işaretlemek unutmayın.
İlköğretim Sınıf:
final class myPrimaryClass {
private static $instance = null;
private function __construct() {
// do something or not
return $this;
}
public static function getInstance() {
if (is_null(self::$instance) || !(self::$instance instanceof myPrimaryClass))
self::$instance = new myPrimaryClass;
return self::$instance;
}
}
Singleton Alt sınıf:
final class mySingletonSubClass {
private static $instance = null;
private function __construct(myPrimaryClass $primaryClassInstanceRef) {
return $this;
}
public static function getInstance(myPrimaryClass $primaryClassInstanceRef) {
if (is_null(self::$instance) || !(self::$instance instanceof mySingletonSubClass))
self::$instance = new mySingletonSubClass($primaryClassInstanceRef);
return self::$instance;
}
}
Fabrika Alt sınıf:
final class myFactorySubClass {
private function __construct(myPrimaryClass $primaryClassInstanceRef) {
return $this;
}
public static function getNewInstance(myPrimaryClass $primaryClassInstanceRef) {
return new myFactorySubClass($primaryClassInstanceRef);
}
}
Bu örnekte ilgili iki not; İlk, tabii ben fena halde konuyu basitleştirerek. İkinci olarak, istihdam verebilecek bir düzgün hile getInstance()
yöntemleri her zaman sonra ilk kez bir argüman olarak iletilen birincil sınıfın bir örneği olması gerekmez böylece hafifçe alt sınıfları değiştirmek için. Ben singleton sınıfı ile burada bir örnek vereceğiz:
final class mySingletonSubClass {
private static $instance = null;
private static $classInstanceRef = null;
private function __construct(myPrimaryClass $primaryClassInstanceRef) {
return $this;
}
public static function getInstance(myPrimaryClass $primaryClassInstanceRef = null) {
if (!is_null($primaryClassInstanceRef))
self::$classInstanceRef = $primaryClassInstanceRef;
if (is_null(self::$instance) || !(self::$instance instanceof mySingletonSubClass))
self::$instance = new mySingletonSubClass(self::$classInstanceRef);
return self::$instance;
}
}
Bu PHP's type-hinting mechanism dayanır, lütfen unutmayın. Bunun gibi, read the manual entry on it yani nüansları (örneğin varsayılan null) anlamak gerekir.