Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dynamiczne powoływanie obiektu do życia
Forum PHP.pl > Forum > PHP > Object-oriented programming
likemandrake
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?
LBO
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.
likemandrake
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ć.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.