![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 175 Pomógł: 17 Dołączył: 23.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Witam, czy jest jakoś możliwość dynamicznie, za pomocą zmiennych parametrów oraz parametru z nazwą klasy powołać do życia obiekt?
Chciałbym stworzyć metodę, do której przekazujemy x parametrów, gdzie zawsze pierwszy parametr jest to nazwa klasy, jaką należy użyć do tworzenia obiektu, a pozostałe parametry są przekazywane do konstruktora. Wiem że jest możliwe zastosowanie tutaj klasy ReflectionClass, ale niestety do wzorca singletonu, gdzie konstruktor jest inny niż publiczny nie nadaje się po prostu. Jak można czytać wyżej, chcę stworzyć klasę dla wzorca Singletonu z możliwością przekazania parametrów w momencie tworzenia obiektu, poniżej to co udało mi się namaszkiecić: Kod abstract class Singleton { final public function __clone() { trigger_error("Clone is not allowed for " . get_class($this), E_USER_ERROR); } public static function getInstance($sClass) { static $aInstances = array(); if(!isset($aInstances[$sClass])) { $aParams = array(); $aTemp =& func_get_args(); array_shift($aTemp); foreach($aTemp as $key => $value) { $aParams[$key] = '$aTemp[' . $key . ']'; } eval('$aInstances[$sClass] = new ' . $sClass . '(' . implode(', ', $aParams) . ');'); } return $aInstances[$sClass]; } } Jak do tej pory nie udało mi się tego bardziej zoptymalizować pod kątem wydajności, jednak zauważyłem, że przy użyciu ReflectionClass wydajność jest większa o ok. 70% ale problem właśnie taki, że konstruktor musi byc publiczny. Jakies sugestie? Ten post edytował likemandrake 22.03.2008, 20:53:31 -------------------- serwiswww.pl
|
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 1 415 Pomógł: 117 Dołączył: 7.09.2005 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Był już kiedyć podobny temat - generalnie nie można napisać klasy abstrakcyjnej do powoływania Singletonów klasy dziecka - zawsze trzeba to obchodzić.
We frameworku agavi ładnie to zrobili z ładowaniem modelów. Jeżeli model implementuje interfejs agaviModelSingleton loader zwraca instancje modelu trzymaną w pamięci (jeżeli nie istnieje tworzy instancję i ją tam ładuje) - potrzeba do tego jakiegoś managera. Ten post edytował LBO 22.03.2008, 21:00:25 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 175 Pomógł: 17 Dołączył: 23.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
No, w moim wypadku to obiekt można pobierać tak: Singleton::getInstance('nazwa_klasy', 1, 2, 3) lub nazwa_klasy::getInstance('nazwa_klasy', 1, 2, 3). W PHP 5.3.0 takie zabawy nie będą miały miejca, bo pojawiło się tzw. późne statyczne wiązanie dzięki któremu mogę pisać tak: nazwa_klasy::getInstance(1, 2, 3), oczywiscie klasa nazwa_klasy dziedziczy po klasie Singleton. Tak wiec pozostalo czekac na upowszechnienie
![]() Odsyłam do strony http://pl.php.net/manual/en/language.oop5....ic-bindings.php Nadal jednak czekam na jakieś propozycje, przede wszystkim prosiłbym o ReflectionClass, czy da się to tak rozwiązać. Ten post edytował likemandrake 22.03.2008, 21:38:00 -------------------- serwiswww.pl
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 04:52 |