[OOP] Singelton-Muster mit parameter

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [OOP] Singelton-Muster mit parameter

    Hallo Leute,

    habe nun ein Problem mit dem Singelton-Muster.
    PHP-Code:
    function &singelton($class)
    {
        static 
    $singelton;

        if (!
    is_object($singelton))
        {
            
    $singelton = new Singelton();
        }

        return 
    $singelton->insatnce($class);
    }

    class 
    Singelton
    {
        var 
    $instances = array();

        function 
    Singelton(){}

        function 
    insatnce($class)
        {
            if (!isset(
    $this->instances[$class]) 
                OR !
    is_object($this->instances[$class]))
            {
                
    $this->instances[$class] = new $class();
            }
            
            
    $pointer =& $this->instances[$class];
            return 
    $pointer;
        }

    Das Muster wird dann eingesetzt, wenn nur eine Instanz von einer Klasse existieren soll.
    PHP-Code:
    class Test
    {
        var 
    mtime null;
        
        function 
    Test()
        {
            
    $this->mtime microtime();
        }
        
        function 
    getTime()
        {
            return 
    $this->mtime;
        }
    }

    $test singelton('Test');
    echo 
    $test->getTime();

    sleep(2);

    $test singelton('Test');
    echo 
    $test->getTime(); 
    Hab ich aus dem PHP Magazine 1.04. Funktioniert auch wunderbar, nur es gibt ein Prob. es können keine Argumente/Parameter übergeben werden. Also versuchte ich das Muster auszubauen. Leider ohne Erfolg...
    PHP-Code:
    function &singelton($class$params=array())
    {
        static 
    $singelton;

        if (!
    is_object($singelton))
        {
            
    $singelton = new Singelton();
        }

        return 
    $singelton->insatnce($class$params);
    }

    class 
    Singelton
    {
        var 
    $instances = array();

        function 
    Singelton(){}

        function 
    insatnce($class$params=array())
        {
            if (!isset(
    $this->instances[$class]) 
                OR !
    is_object($this->instances[$class]))
            {            
                if (
    sizeof($params) > 0)
                    
    $this->instances[$class] = new $class(join(', '$params));
                else
                    
    $this->instances[$class] = new $class();
            }
            
            
    $pointer =& $this->instances[$class];
            return 
    $pointer;
        }

    Der Test
    PHP-Code:
    class Foo
    {
        function 
    Foo(){ }
        
        function 
    FooBar()
        {
            return 
    'FooBar';
        }
    }

    class 
    Bar
    {
        var 
    $obj null;
        
        function 
    Bar($objFoo)
        {
            if(!
    is_object($objFoo))
                die(
    '$objFoo is not a valid object');
            
            
    $this->obj $objFoo;
            return 
    $this->obj->FooBar();
        }
    }

    $objBar singelton('Bar'singelton('Foo')); 
    ergab folgendes:
    Code:
    $objFoo is not a valid object
    Ist auch kein wunder durch die Funktion join wurde das Objekt in ein String umgewandelt. Auch andere versuche schlugen fehl. Hat jemand eine zündende Idee.

    cheers
    Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jedermann ist davon überzeugt, dass er genug davon habe – René Descartes
    PHP Sicherheit
    PHPUnit[1-2]
    Professionelle Softwareentwicklung mit PHP 5
    Professionelle PHP 5-Programmierung

  • #2
    kannst du das join nicht einfach weglassen?
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      Original geschrieben von mrhappiness
      kannst du das join nicht einfach weglassen?
      In diesen Fall ja. Ausserdem is mir ein Sytanxfehelr unterlaufen. Anstatt
      PHP-Code:
      $objBar singelton('Bar'singelton('Foo')); 
      sollte es
      PHP-Code:
      $objBar singelton('Bar', array(singelton('Foo'))); 
      lauten. Sorry.

      Wie gesagt in diesen Fall hast du Recht. Ich könnte den Parameter, ohne die Funktion join zu benutzen, direkt übergeben. Aber die Anzahl und die Typen der Argumente ändern sich von Klasse zu Klasse. Das kann also nicht die optimale Lösung sein.

      cheers
      Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jedermann ist davon überzeugt, dass er genug davon habe – René Descartes
      PHP Sicherheit
      PHPUnit[1-2]
      Professionelle Softwareentwicklung mit PHP 5
      Professionelle PHP 5-Programmierung

      Kommentar


      • #4
        auch wenn mir die funktion / der zweck der singleton klasse unklar ist ..
        sieh dir mal diese 2 funktionen an:
        http://at.php.net/manual/de/function.call-user-func.php
        http://at.php.net/manual/de/function...func-array.php
        mfg,
        [color=#0080c0]Coragon[/color]

        Kommentar


        • #5
          wenn du alle parameter in ein array packst, hast du immer genau einen parameter und die klasse, der dies array letztendlich übergeben wird, sollte doch wissen, was in "ihrem" array drinzustehen hat oder?
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            klärt mal einen unwissenden auf, was ein "Singelton" ist...
            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


            Kommentar


            • #7
              is eine art entwurfsmuster, eine klasse die nicht mehr als einmal instantiiert werden kann, also sowas wie ne "globale klasseninstanz"
              aufgeweicht: es können maximal n instanzen existieren

              kann ganz nützlich sein, wenn man genau ein objekt braucht, aber in verschiedenen situationen und eventuell auch die reihenfolge der abarbeitung nicht kennt, da sie variabel ist

              man bastelt sich also ne klasse mit ner methode, die eine neue instanz eines objekts kreiert, wenn es noch nicht existiert, anderenfalls wird eine referenz auf das bereits bestehende objekt zurückgegeben


              wenn du z. b. eine userklasse und ne templateklasse hast, die beide auf die datenbank zugreifen, kannst du entweder im deinem skript ein db-Objekt erzeugen obwohl du das da gar nicht brauchst oder du bastelst dir so ein singleton pattern und erzeugst in der userklasse und in der templateklasse ein db-objekt und hast das gleiche erreicht
              Ich denke, also bin ich. - Einige sind trotzdem...

              Kommentar


              • #8
                Original geschrieben von Abraxax
                klärt mal einen unwissenden auf, was ein "Singelton" ist...
                Oft ist es wichtig oder zumindest von Vortreil, wenn es von einer Klasse genua ein Exemplar gibt. Die Gründe hierfür könne vielseitig sein.Denkt man an eine klasse die Session-IDs generierd, verwaltet und vergibt, so ist es Essenziell wichtig, dass nur ein Exemplar dieser Klasse existiert.

                Ein weiterer, oft genutzer Einsatzzweck ist das Ressourcen-Sharing. Verwndet man Beispielweise eine Klasse zur Logfile-Generierung, vermeidet man I/O-Konflikte, indem das Logfile von genau einem Exemplar dieser Klasse verwaltet wird, au fas verschiedenen Stellen im Code aus zugegriffen wird. Auch können limitierte Resourcen, etwa Datenbank, auf stark frequentirten Seiten schon mal knapp werden. Hat man nicht die Möglichkeit, die Anzahl der erlaubten Verbindungen selbst zu erhöhen, muss man Maßnahmen ergreifen, die knappen Ressourcen so gut wie möglich zu schonen. Ein ansatzpunkt ist dieDatenbankabstraktion, sofern eine gesetzt wird. Diese ist meist als Objekt realisiert und benötigt midesetens eine Verbindung zur Datenbank. Verwendet die Applikation nun mehrere Exemplare der Datenbankabstraktion, erhöt sich damit automatisch die Anzahl der Datenbankverbindungen. Überlässt man hingegen dem Singelton-Muster (engl. singelton pattern) die Verwaltung der Datenbankabstaktion, benötigt jeder benutzer nur noch eine Datenbankverbindung. Kombiniert man dies mit SRM (Script Running Magic), ist es durchaus möglich, dass aller Benutzer sich genau eine Datenbankverbindung teilen...


                [edit] war wohl etwas zu langsam.

                cheers
                Zuletzt geändert von schlimmerfinger; 05.03.2004, 14:38.
                Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jedermann ist davon überzeugt, dass er genug davon habe – René Descartes
                PHP Sicherheit
                PHPUnit[1-2]
                Professionelle Softwareentwicklung mit PHP 5
                Professionelle PHP 5-Programmierung

                Kommentar


                • #9
                  wobei das mit den datenbankverbindungen bei php un mysql im standardfall nicht greifen sollte, da eine bestehende verbindung genutzt wird

                  imo macht das sowieso eher im OO-bereich mitsamt ereignisgesteuertem ablauf und co. sinn; ein php-skript wird zeile für zeile ausgeführt, da läuft nichts paralell, also kann ich auch innerhalb eines skripts keine I/O-konflikte haben
                  in mehreren skripten/instanzen eines skriptes ist das aber möglich, nur hilft dir dein singleton da doch auch nicht weiter oder?
                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Kommentar


                  • #10
                    Original geschrieben von mrhappiness
                    wobei das mit den datenbankverbindungen bei php un mysql im standardfall nicht greifen sollte, da eine bestehende verbindung genutzt wird
                    Das wusste ich garnicht...

                    Original geschrieben von mrhappiness
                    imo macht das sowieso eher im OO-bereich mitsamt ereignisgesteuertem ablauf und co. sinn; ein php-skript wird zeile für zeile ausgeführt, da läuft nichts paralell, also kann ich auch innerhalb eines skripts keine I/O-konflikte haben in mehreren skripten/instanzen eines skriptes ist das aber möglich, nur hilft dir dein singleton da doch auch nicht weiter oder?
                    Da hast du Recht... Trotztdem will ich jetzt das Kind schaukeln

                    cheers
                    Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jedermann ist davon überzeugt, dass er genug davon habe – René Descartes
                    PHP Sicherheit
                    PHPUnit[1-2]
                    Professionelle Softwareentwicklung mit PHP 5
                    Professionelle PHP 5-Programmierung

                    Kommentar


                    • #11
                      dann tu was du nicht lassen kannst *g*

                      ich denke immer noch, dass es mit der array-variante gehen sollte, schließlich weiß der konstruktor der jeweiligen klasse was für parameter in dem array drin sind
                      Ich denke, also bin ich. - Einige sind trotzdem...

                      Kommentar


                      • #12
                        wofür hab ich denn

                        log :: append ( 'mySQL Error: ' mysql_error() );

                        in der funktion können ja dann konstanten für den dateinamen etc verwendet werden .. oder ein globales config array / objekt ..
                        mfg,
                        [color=#0080c0]Coragon[/color]

                        Kommentar


                        • #13
                          @happy && @schlimmerfinger
                          danke für die ausführliche läuterung..
                          INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                          Kommentar

                          Lädt...
                          X