singleton problem

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

  • singleton problem

    Hallo, ich habe ein Problem mit dem Singleton Design Pattern. Ich brauche eine Variable oder Klasse (ist ja auch erstmal egal) welche über die gesamte Laufzeit des Servers zur Verfügung steht und die es eben auch nur einmal gibt. Eben ein "echtes" Singleton. Wenn es sie noch nicht gibt soll sie beim 1. Mal instanziiert werden. Aber mit folgendem Code funktioniert es leider nicht.
    PHP-Code:
    <?php
    class Singleton {
      private static 
    $instance=null;
      private static 
    $value=null;

      private function 
    __construct($value) {
          
    $this->value $value;
      }

      public function 
    setValue$value) {
        
    $this->value $value;
      }

      public function 
    getValue( ) {
        return 
    $this->value;
      }

      public static function 
    getInstance() {
        if( 
    self::$instance == null ) {
          
    self::$instance = new Singleton("values");
        }
        return 
    self::$instance;
      }
    }

    $x Singleton::getInstance();

    if( 
    $_REQUEST["val"] != "") {
      
    $x->setValue$_REQUEST["val"]);
    }
    echo 
    "<br>value = ".$x->getValue();
    ?>
    Ausgabe
    1. Request http://localhost/singleton.php
    value = values

    2. Request http://localhost/singleton.php?var=test
    value = test

    3. Request http://localhost/singleton.php
    value = values

    Obwohl ja beim 3. Request test erscheinen sollte. Warum wird das Singleton bei jedem Request neu instanziiert?

    Danke für Eure Hilfe.

  • #2
    Re: singleton problem

    Original geschrieben von hick.hack
    Obwohl ja beim 3. Request test erscheinen sollte. Warum wird das Singleton bei jedem Request neu instanziiert?
    ne, so funktioniert das nicht.
    php-variablen stehen dir nur während der laufzeit des scriptes zur verfügung. bei einem request wird das script gestartet, html ausgegeben und dann wieder beendet - danach sind wieder alle variablen weg. der nächste request fängt sozusagen bei null an.

    möchtest du variablen über mehrere requests halten, musst du sessions benutzen.

    Kommentar


    • #3
      du hast Singleton falsch verstanden. Singleton ist dafür da, um Resources zu sparen, z.B. bei einer Datenbankverbindung. Das Objekt ist aber genau so weg wie jede andere Variable auch, wenn der Parser seine Arbeit beendet, es sei denn du speichert es in Session.

      Kommentar


      • #4
        vielen Dank für die Erkentnisse, da muss ich wohl nach einer anderen Lösung suchen.

        Gruß hick.hack

        Kommentar


        • #5
          Hi,

          serialisiere dein singleton bevor das script beendet ist und
          passe deine getInstance methode so an, dass sie auch
          versucht das serialisierte objekt zu laden falls vorhanden.

          ps.: ich hab allerdings keine ahnung wo sowas sinnvoll sein
          könnte.

          greets
          (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

          Kommentar


          • #6
            PHP-Code:
            session_start ( );

            class 
            Singleton {
              private 
            $instance=null;
              private static 
            $value=null;

              private function 
            __construct( ) {
                if ( !empty ( 
            $_SESSION 'sobject' ] ) ) {
                  
            self::$instance unserialize$_SESSION 'sobject' ] );
                }
              }

              private function 
            __destruct ( ) {
                
            $_SESSION 'sobject' ] = serialize self :: $instance );
              }

              ...

              public static function 
            getInstance() {
                if( 
            self::$instance == null ) {
                  
            self::$instance = new Singleton("values");
                }
                return 
            self::$instance;
              }

            ungetestet ...
            Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

            Kommentar


            • #7
              Original geschrieben von closure
              ps.: ich hab allerdings keine ahnung wo sowas sinnvoll sein
              könnte.
              hast du jemals mit ASP zu tun gehabt? und wenn auch schon Application-Var verwendest? Dann willst du sie garnicht missen

              Kommentar


              • #8
                Hi,

                ja aber nur kurz. Und dann auch mit vbs. Nichts mit dem ich mehr
                zu tun haben möchte . Und da ich dann also immer noch nicht
                weiss wozu es gut ist, kannst du vll. kurz anhand eines beispiels
                sagen worum es geht?
                (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                Kommentar


                • #9
                  Auf Application-Variable kannst du immer zugreifen, sogar session-unabhängig. Somit ist z.B.

                  - das Zählen von Onlineuser ganz easy, in session_onstart zählst du hoch, in session_onend wieder ein User weniger, somit hast du die Anzahl der User immer, ohne DB-Abfrage durchführen zu müssen

                  - oder Anzahl von Lizenzen verwalten, um den Zugriff auf die WebApp zu gewähren oder zu verweigern

                  - etc...

                  Kommentar


                  • #10
                    Ah, ok. Nice to have.

                    greets
                    (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                    Kommentar

                    Lädt...
                    X