Mam problemy z dziedziczeniem PHP. Oto sprawa:Singlety PHP i dziedziczenie
mam tę klasę bazową, Singleton:
namespace My_Namespace;
abstract class Singleton {
protected static $instance = null;
static function get() {
if (null == static::$instance) {
static::$instance = new static;
}
return static::$instance;
}
private function __construct() {
}
}
Mam pęczek klas dziedziczących tej klasy Singleton, nazywają je A, B, C, D. Jeden z nich wygląda tak:
namespace My_Namespace;
class A extends Singleton {
protected function __construct() {
B::get();
if (some_condition()) {
C::get();
}
else {
D::get();
}
}
}
Teraz, po prostu zrobić A::get()
dostać to wszystko w ruch. Konstruktor klasy A jest wywoływany zgodnie z oczekiwaniami. Następnie konstruktor B nazywa się, znowu bez problemu. Teraz robi się dziwnie. Po wywołaniu C::get()
rozpoznaje on static::$instance
jako już obiekt klasy B i nie tworzy w ogóle C. Wiem, że jeśli je połączę łańcuchowo, to __construct
z B-wywołania C::get
lub D::get
działa, ale to nie jest optymalne dla moich celów. Czy to dlatego, że są w tym samym zakresie? Jeśli tak, czy jest jakiś sposób obejścia tego? Pytam o to raczej ciekawość, a nie cel praktyczny - wiem, że równie dobrze mogę zaimplementować wzór singletonowy w każdym z nich. Jakieś pomysły? Dzięki!
P.S. Proszę, nie ma komentarzy "singletons are evil and you burn in hell". Znam to doskonale.
+1 dla "nie ... palić w komentarzach piekła" – phpisuber01
Wierzę, że odziedziczone klasy wymagają statycznej właściwości, aby instancja została wepchnięta do ... więc dodaj 'protected static $ instance = null; 'do podklas . – Orangepill
@Orangepill masz to. Dodałem tę linię i wszystko działa zgodnie z oczekiwaniami. 'BUT:' W ten sposób cała klasa Singleton i dziedziczenie są bezużyteczne, chociaż ... Chodziło o to, aby w tej klasie była zawarta pojedyncza funkcjonalność. Czy to w ogóle możliwe? –