Singleton - moduły do CMS

Odpowiedz Nowy wątek
2011-11-18 13:34
0

Witam, pierwszy raz używam Singleton'a i ciekawi mnie jedna rzecz, piszę silnik do CMS'a i właśnie tutaj chciałem sprawdzić działanie tego wzorca projektowego. Modułów będzie dużo i chciałbym wiedzieć czy to w jakiś sposób będzie wydajniejsze niż normalnie wywołanie modułu. Oto taki prosty kod który pokazuje jak chciałbym to zrobić.
Tutaj plik główny silnika:

<?php   
    class CMS {
        private static $instance;
        private function __construct() {}

        public static function getInstance(){
            if (self::$instance === null) {
                echo ' jest ';
                self::$instance = new CMS();
            }
            return self::$instance;
        }

        public function load($modul){
            if (file_exists(strtolower($modul).'.php')){
                require_once(strtolower($modul).'.php');
                return $modul::getInstance();
            }
        }
    } 

    CMS::getInstance()->load('Portfolio')->wyswietlWpisy();
    CMS::getInstance()->load('Portfolio')->dodajWpis();
?>

A tu plik z modułem, dla przykładu to Portfolio:


<?php
    class Portfolio {   
        private static $instance;
        private function __construct() {}

        public static function getInstance(){
            if (self::$instance === null) {
                self::$instance = new Portfolio();
            }
            return self::$instance;
        }
        public function wyswietlWpisy(){
            echo 'tu będą wpisy';
        }   
        public function dodajWpis(){
            echo 'tu będzie dodawanie wpisu';
        }   
    }
?>

Proszę o opinie.


edytowany 1x, ostatnio: corey, 2011-11-18 13:35
w przypadku php nie ma "prawdziwych" singletonów, bo obiekty nie mogą być współdzielone pomiędzy sesjami. Pomiędzy wywołaniami też chyba nie do końca. Zatem jedyny plus to uodpornienie kodu na wielokrotną inicjalizację obiektów danej klasy. - Koziołek 2011-11-18 14:02

Pozostało 580 znaków

2011-11-19 12:29
wskaźnik
1

Moim zdaniem singleton nie ma praktycznie żadnego zastosowania w php. Dla każdego wywołania i tak tworzony jest nowy obiekt danej klasy, który jest unikatowy dla każdego wywołania.
Tutaj kilka linków:
Static call versus Singleton call in PHP
Static methods vs singletons: choose neither
W językach statefull (jak to po polsku się mówi?), gdzie obiekty nie są tworzone i niszczone przy każdej akcji, pewnie można coś z singletonem zrobić, ale mnie to od zawsze odradzano.
Singletons: anti-pattern, or worst anti-pattern ever?
Singleton is an anti-pattern
Jest cała masa różnych artykułów na temat singletona.

A teraz odpowiedź na pytanie ;)
Nie wiem co znaczy normalne wywołanie. Jeśli zastosujesz normalne tworzenie obiektów, to szybkość powinna być prawie identyczna (i tak zawsze tworzony będzie nowy obiekt), jeśli zastosujesz jakieś inne cuda to nie mam pojęcia.

Pozostało 580 znaków

2011-11-19 13:28
0

Zajrzę do tych linków, bo na prawdę ciekawy jestem jak wygląda wydajnościowo, ale jeśli podobnie, to wygodniej mi będzie chyba w przypadku CMS ładować tylko dany moduł. Co miałem na myśli mówiąc normalne wywołanie? Chodziło mi o stworzenie obiektu na początku strony np.
$portfolio = new Portfolio();
i później zamiast:

       CMS::getInstance()->load('Portfolio')->wyswietlWpisy();
        CMS::getInstance()->load('Portfolio')->dodajWpis();

odwołuję się bezpośrednio do obiektu:

       $portfolio->wyswietlWpisy();
       $portfolio->dodajWpis();

edytowany 1x, ostatnio: corey, 2011-11-19 13:29

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0