Ankündigung

Einklappen
Keine Ankündigung bisher.

Seitenweite DB-Verbindung (Singleton)

Einklappen

Neue Werbung 2019

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

  • Seitenweite DB-Verbindung (Singleton)

    Ich will eine 2. DB Verbindung für mein vB einbinden.
    Habe es folgendermassen probiert
    PHP-Code:
    class ragtek_seconddatabaseconnection
    {
        private static 
    $instance null;

        public function  
    __construct() {
            
    $d = new vB_Database(vB::$vbulletin);
            
    $d->connect('database''localhost'null'seconduser''');
            return 
    $d;
        }

        public static function 
    Instance()
        {
            if (
    self::$instance === null)
            {
                
    self::$instance = new ragtek_seconddatabaseconnection();
            }
            return 
    self::$instance;
        }
    }
    $con ragtek_seconddatabaseconnection::Instance();
    $con->query(.........) 
    Erhalte dabei folgenden Fehler:
    Call to undefined method ragtek_seconddatabaseconnection::query() in...
    Was mach ich hier falsch?


  • #2
    extends?
    Wobei - bei nem Singleton mit static macht das nicht viel Sinn.

    [edit]
    Ach so nee, jetzt seh ichs. Ein Konstruktor gibt natürlich auch das Objekt zurück, das instanziiert wird. Also seconddatabaseconnection. Ein anderes Objekt zurückgeben geht nicht.
    --

    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      Du willst von einer Klasse eine Instanz erstellen die dann aber per return im __construct zu einem anderen Objekt wird ?
      Ich glaube nicht dass das so geht, is irgendwie schon logisch komisch.
      Speicher doch einfach das Datenbankobjekt in der static-Variable und geb das dann zurück ^^

      Grüße
      Signatur:
      PHP-Code:
      $s '0048656c6c6f20576f726c64';
      while(
      $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

      Kommentar


      • #4
        Ich glaube nicht, dass man in Konstruktoren Klassen zurückgeben sollte. Der Konstruktor wird ja bei der Erzeugung des Objektes aufgerufen um das Objekt in einen definierten Startzustand zu bringen. So wie ich das Manual verstehe ist der Ablauf eher:

        Objekt erzeugen -> Objektreferenz zurückgeben -> Objekt->__construct() aufrufen

        als:

        Objekt soll erzeugt werden -> gib Objekt->__construct() zurück

        Edit: zu spät. Naja, damit hier noch was sinnvolles steht: Bei Singletons sind Konstruktoren meist zumindest protected, genauso wie __clone.

        Kommentar


        • #5
          Speicher doch einfach das Datenbankobjekt in der static-Variable und geb das dann zurück ^^
          Das mach ich doch mit
          PHP-Code:
          self::$instance = new ragtek_seconddatabaseconnection(); 
          Phu, falls nicht versteh ich gerade nur Bahnhof und dann ist es wohl Zeit für Hirn runterfahren und Morgen weitermachen.

          Kommentar


          • #6
            Nein, machst Du nicht. Ja, fahr mal runter.
            --

            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


            --

            Kommentar


            • #7
              PHP-Code:
              <?php echo get_class($con);?>

              Kommentar


              • #8
                tsss, wie konnte mir das nur passieren.
                Danke, der Hinweis mit
                Ich glaube nicht, dass man in Konstruktoren Klassen zurückgeben sollte. Der Konstruktor wird ja bei der Erzeugung des Objektes aufgerufen um das Objekt in einen definierten Startzustand zu bringen. So wie ich das Manual verstehe ist der Ablauf eher:
                hat geholfen

                Kommentar


                • #9
                  So.
                  Eventuell noch Verbesserungsvorschläge?
                  PHP-Code:
                  class ragtek_seconddatabaseconnection
                  {
                      private static 
                  $instance null;

                      
                  /**
                       * Constructor protected to enforce singleton use.
                       */
                      
                  protected function  __construct() {
                      }

                      
                  /**
                       * returns the databaseconnection
                       * @return <vB_Database> Database Object
                       */
                      
                  public static function Instance()
                      {
                          if (
                  self::$instance === null)
                          {
                              
                  self::$instance = new vB_Database(vB::$vbulletin);
                              
                  self::$instance->connect('...');
                          }
                          return 
                  self::$instance;
                      }

                      
                  /**
                       * protected to enforce singleton use
                       */
                      
                  protected function  __clone() {
                      }

                  Kommentar


                  • #10
                    Ja. Lass das ganze Singeltongedöhns weg und benutze eine Registry.
                    seconddatabaseconnection sagt ja schon, dass eben kein Singleton genutzt wird.
                    --

                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                    --

                    Kommentar


                    • #11
                      Wieso Registry und kein Singleton?
                      Ich brauche die Verbindung nicht global in der ganzen Applikation. Ich brauche sie nur auf 2 Stellen in der Applikation.
                      (Edit: OK nach nochmaligen lesen klingen die 2 Sätze komisch..)


                      Das Singleton ist ein Entwurfsmuster aus der Softwareentwicklung. Das Singleton gewährleistet, dass von einer Klasse nur ein Objekt erzeugt werden kann.
                      Um aus verschiedenen Klassen auf "globale" Objekte und Variablen zuzugreifen, gibt es das Registry-Entwurfsmuster. Die Registry kann als abstract deklariert werden, da nur statische Attribute und Methoden verwendet werden.
                      Muss zugeben, dass mir die Pattern immer wieder über den Weg rennen, aber ich mit der Verwendung noch probleme habe..

                      Kommentar


                      • #12
                        Du brauchst 2 global verfügbare Instanzen von vB_Database, nicht je eine Singleton-Instanz von ragtek_firstdatabaseconnection und ragtek_seconddatabaseconnection.
                        --

                        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                        --

                        Kommentar


                        • #13
                          OK stop
                          Hier mal die "Erklärung"

                          Also, das vBulletin hat schon eine Standard Datenbankinstanz.
                          Dann brauche ich noch "gelegentlich" eine 2. Instanz und für diese hab ich mir gedacht, dass das Singletonmuster am besten wäre, da das Skript nicht wirklich weiß, wann sie wo benötigt wird(wird dynamisch vom Code benötigt, kann sein das sie 0,1,2,...n mal benötigt wird)
                          Bis jetzt mache ich es so, das ich jedesmal wenn ich die Verbindung brauche, dies öffne, die Daten hole, ausgebe und schliesse. (Und das kann rein theoretisch, je nach konfiguration eben n Mal sein, was ja eigentlich ein Schwachsinn in meinen Augen ist.)

                          Kommentar


                          • #14
                            Zitat von ragtek Beitrag anzeigen
                            So.
                            Eventuell noch Verbesserungsvorschläge?
                            PHP-Code:
                                public static function Instance()
                                {
                                    if (
                            self::$instance === null)
                                    {
                                        
                            self::$instance = new vB_Database(vB::$vbulletin);
                                        
                            self::$instance->connect('...');
                                    }
                                    return 
                            self::$instance;
                                }
                            ... 
                            connect() sollte erst dann ausgeführt werden, wenn du die Query ausführen willst. Nicht bereits beim erzeugen der Instanz.

                            des weiteren müssten glaube ich auch noch __sleep() und __wakeUp() auf protected stehen...



                            Ich hab da mal vorbereitet...
                            PHP-Code:
                            <?php
                            class {
                                protected 
                            $_a;
                                protected static 
                            $_inst null;
                                
                                protected function 
                            __construct()
                                {
                                    
                            $this->_a 'inst_1';
                                }
                                
                                public static function 
                            getInst()
                                {
                                    if (
                            self::$_inst === null) {
                                        
                            self::$_inst = new self();
                                    }
                                    return 
                            self::$_inst;
                                }

                                public function 
                            set()
                                {
                                    
                            $this->_a 'inst_2';
                                }
                                
                                public function 
                            get()
                                {
                                    echo 
                            $this->_a '<br />';
                                }

                                protected function 
                            __clone(){}
                            }

                            $a A::getInst();
                            $a->get();    // Ausgabe: inst_1
                            $res serialize($a);
                            $b unserialize($res);
                            $b->set();

                            $a->get();    // Ausgabe: inst_1
                            $b->get();    // Ausgabe: inst_2
                            "My software never has bugs, it just develops random features."
                            "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

                            Kommentar


                            • #15
                              Zitat von nikosch Beitrag anzeigen
                              Ja. Lass das ganze Singeltongedöhns weg und benutze eine Registry.
                              So, OK, hab mir nochmal PHP Design Patterns geschnappt, Seite 402 aufgeschlagen und folgendes gelesen
                              Eine Registry speichert Objekte oder Informationen, die von anderen Objekten gemeinsam genützt werden.
                              Auf die Registry kann über einen globalen Zugriffspunkt zugegriffen werden
                              Also ja, irgendwie hast du schon recht

                              Kommentar

                              Lädt...
                              X