Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Klasse einbinden?

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Klasse einbinden?

    Hallo erstmal!

    Ich erstelle gerade eine PHP Webanwendung (Objektorientiert). Nun habe ich folgendes Problem, ich möchte die Datenbankanbindung per ADODB erstellen. Das funktioniert soweit auch tool.
    Nun gibt es eine etwas schönere Lösung als in jedem Objekt das ADODB Objekt wieder neu zu erstellen? Kann man das ganze allenfals sogar so integrieren das es z.B. wie mysql verwendet werden kann?
    Besteb Dank für eure Hilfe.

  • #2
    Wie wärs wenn du das ADODB Objekt außerhalb der Klasse instanziert und den Klassen die darauf zugreifen sollen einfach nur eine Referenz übergibts?
    Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

    Kommentar


    • #3
      Vielleicht ist auch das singleton pattern was für dich.
      Einfach mal nach suchen.

      Kommentar


      • #4
        Re: Klasse einbinden?

        Zitat von MrUnterberg
        Nun gibt es eine etwas schönere Lösung als in jedem Objekt das ADODB Objekt wieder neu zu erstellen?
        Du wirst ja nicht in jedem Objekt auf die Datenbank zugreifen, oder? Du kannst z.B. mit Data Access Objects arbeiten. Diese bieten dir z.B. für bestimmte Module Methoden an, wie getAllAddresses() oder insertUser() etc. und alle übrigen Objekte greifen nicht auf die Datenbank zu. Diese DAO's leistest du dann von einer Abstrakten Klasse DAO ab, die die ADOdb-Kasse bereit hält - entweder als statische Variable oder, indem du sie als Refernz übergibst oder, indem du dir im Konstruktor die Instanz holst und ADOdb eben als Singleton umsetzt:

        PHP-Code:
        <?php
        abstract class DAO
        {
            protected 
        $Database;
         
            public function 
        __construct()
            {
                
        $this->Database Database::getInstance();
            }

            protected function 
        escapeString($aVales)
            {
                
        // ...
            
        }
        }

        class 
        UserDAO
        {
            public function 
        __construct()
            {
                
        parent::__constuct();
            }

            public function 
        insertUser($sUsername$sEMail)
            {
                list (
        $sUsername$sEMail) = $this->escapeString(array($sUsername$sEmail)); 
                
        $sQuery "INSERT ...";
                
        $bSuccess $this->Database->execQuery($sQuery);
                if (!
        bSuccess) throw ...
             
            }
        }

        abstract class 
        Module
        {
            protected 
        $DAO;

            public function 
        __construct()
            {
                
        $this->DAO DAO_Factory::getDAO($this->sModuleName);
            }
        }

        class 
        UserModule extends Module
        {
            protected 
        $sModuleName;

            public function 
        __constuc()
            {
                
        $this->sModuleName 'User';
                
        parent::__construct()
            }

            public function 
        addUser($sUsername$sEMail)
            {
                
        // validate data...
                
        $bSuccess $this->DAO->addUser($sUsername$sEMail); 
                
        // ...
            
        }
        }

        class 
        Database
        {
            private static 
        $Instance;
            private 
        $ADOdb;

            public static function 
        getInstance()
            {
                if (!isset(
        self::$Instance)) self::$Instande = new Database();
                return 
        self::$Instance;
            }

            public function 
        __construct()
            {
                
        $this->ADOdb = new ADONewConnection(...);
            }

            public function 
        execQuery($sQuery)
            {
                return 
        $this->ADOdb->Execute($sQuery);
            }
        }
        ?>
        ...oder so in der Art halt.

        Basti

        Kommentar


        • #5
          Hallo,

          ich habe dafür eine Klasse die Ich Context nenne, diese ist in jeder meiner Klassen verfügbar und enthält neben der Referenz zur DB Connection auch einen OO Zugriff auf die Request Daten und alle weitere Umgebungsvariablen der Anwendung. Also eine Abstract Factory der sich die ganze Anwendung bedient.

          Kommentar


          • #6
            Danke für eure Hilfe! Hab mal google nach "singleton pattern" gefragt. Ist genau das was ich suche. Es hat nicht zufällig jemand von euch das schon mal mit Adodb oder ähndlichem sowas gemacht?

            Kommentar


            • #7
              Es hat nicht zufällig jemand von euch das schon mal mit Adodb oder ähndlichem sowas gemacht?
              oder ähnlichem. Das Gute bei patterns ist doch, dass sie weitgehend unabhängig vom konkreten Problem immer ähnlich/gleich umgesetzt werden.

              http://www.developertutorials.com/tu...729/page1.html

              hm, phppatterns.com ist down. Da war auch eine gute, kompakte Beschreibung.

              Kommentar


              • #8
                Ich würde von dem Singleton absehen, "Program to Interfaces and not to Implementations". Das Thema wurde vor einiger Zeit auch schon von den Profis durchgekaut:

                http://www.phpfriend.de/forum/ftopic36035.html

                Kommentar


                • #9
                  Ich würde von dem Singleton absehen
                  Wie würdes du den das implementieren?

                  Kommentar


                  • #10
                    Ich würde Dir raten nochmal den oben gennanten Thread zu lesen, da steht das nochmal ausführlicher.
                    Wie ich schon sagte würde ich mir Factory / Abstract Factory bauen, die Du als Parameter jeder Klasse Deines Frameworkes übergibst. Dein Connection Objekt liefert Dir dann die Factory. Die Factory kann dann natürlich immer noch die DB Connection als als Singleton implementieren.
                    Du solltest Dir mal mal das Mojavi Projekt anschauen, da ist das sehr schön umgesetzt. Ich benutze das selber seit der 2er Version und kann es nur empfehlen.

                    Kommentar


                    • #11
                      Wobei die Unterschiede für php4-von-Hand-Coder nur theoretischer oder homöopatischer Natur sind.
                      Keine privaten und keine statischen Methoden, keine abstrakten Klassen ...damit wird das alles zu einer Soße und Singelton kann auch als parameterlose factory betrachtet werden.

                      Das soll jetzt aber keine Aufforderung sein, sich nicht damit zu beschäftigen.

                      Kommentar


                      • #12
                        Richtig, man muß natürlich immer Aufwand und Nutzen miteinander abwäge, php4-von-Hand-Coder brauchen wahrscheinlich auch kein Singleton.

                        Kommentar


                        • #13
                          Naja, wenn man bei google unter "php singleton" nachschaut, findet sich häufig
                          PHP-Code:
                          <?php
                          function foo()
                          {
                              static 
                          $v null;
                              if (
                          is_null($v)) {
                                  
                          $v irgendwastolles();
                              }
                              return 
                          $v;
                          }
                          ?>
                          Was im Grunde kein Singleton ist.
                          Aber es ist so einfach zu beschreiben und zu verstehen, auch wenn es fast nur eine andere Schreibweise für global ist

                          Kommentar

                          Lädt...
                          X