Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Dynamiczne powoływanie obiektu do życia
likemandrake
post
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
Go to the top of the page
+Quote Post
LBO
post
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
Go to the top of the page
+Quote Post
likemandrake
post
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 smile.gif

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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 04:52