Ankündigung

Einklappen
Keine Ankündigung bisher.

Datenbank Class einbinden.

Einklappen

Neue Werbung 2019

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

  • Datenbank Class einbinden.

    Moin,
    Ich habe derzeit meine DB Class fertiggestellt für mein Projekt.
    Jetzt ist meine Frage wie ich die class am besten einsetze, ohne in jeder function meiner anderen Klassen die DB Class zu definieren $db = new DB('localhost', 'root', '', 'tabelle');

    Meine DB Class ist momentan so aufgebaut:
    <?php

    PHP-Code:
    class DB extends mysqli
    {
        public function 
    __construct($host 'localhost'$user null$pass null$db null){
            
    //....
        
    }

        public function 
    query($sql)
        {
    //...
        
    }

    Grüße und Danke

  • #2
    Stichwort: Dependency Injection. Übergib den Instanzen einer Klasse beim Erstellen die anderen Objekte, die sie zur Arbeit brauchen.

    Grob so:

    PHP-Code:
    class Foo
    {
        protected 
    $db;

        public function 
    __construct(DB $db)
        {
            
    $this->db $db;
        }
    }

    $foo = new Foo($existingDbInstance); 

    Kommentar


    • #3
      Zitat von mermshaus Beitrag anzeigen
      Stichwort: Dependency Injection. Übergib den Instanzen einer Klasse beim Erstellen die anderen Objekte, die sie zur Arbeit brauchen.

      Grob so:

      PHP-Code:
      class Foo
      {
          protected 
      $db;

          public function 
      __construct(DB $db)
          {
              
      $this->db $db;
          }
      }

      $foo = new Foo($existingDbInstance); 
      Danke ich habe es jetzt so:

      PHP-Code:
      <?php

      class test extends controller
      {
          public 
      $db;

          public function 
      __construct()
          {
              
      $this->db = new DB('localhost''root''''datenbank');
          }

          public function 
      index()
          {
              
      $qry $this->db->query("...");    
          }
      }
      Gibt es eine Möglichkeit die Klasse noch einfacher zu definieren?
      Sprich in der controller Klasse die DB Klasse zu definieren, damit ich nicht in den einzelnen Controllers die Datenbank-Verbindung angeben muss?

      Kommentar


      • #4
        Warum brauchst du die Datenbank im Controller?
        Evtl. solltest du dein Softwaredesign überdenken.
        [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
        [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

        Kommentar


        • #5
          Zitat von VPh Beitrag anzeigen
          Warum brauchst du die Datenbank im Controller?
          Evtl. solltest du dein Softwaredesign überdenken.
          Wie meinst du das?

          Kommentar


          • #6
            Zitat von ProjectX007 Beitrag anzeigen
            Danke ich habe es jetzt so:
            Das ist das genaue Gegenteil von dem, was mermshaus vorgeschlagen hat, nämlich keine Dependency Injection.
            [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

            Kommentar


            • #7
              Damit DependencyInjection nicht mehr so weh tut: PHP-DI4 bringt Autowiring mit. Hab gerade erst ein Projekt komplett darauf umgebaut. Knallfett.
              Bin mit aber noch nicht sicher, ob das der neue heilige Gral ist.

              Kommentar


              • #8
                PHP-Code:
                public $db
                Sollte das nicht protected sein?

                Zitat von tkausl Beitrag anzeigen
                Das ist das genaue Gegenteil von dem, was mermshaus vorgeschlagen hat, nämlich keine Dependency Injection.
                Ja... selbst wenn er keinen Plan hat was DI ist, er fragt, wie er das ohne feste Kopplung machen kann - und macht es dann doch mit, obwohl ihm sogar ein konkretes, einfach verständliches Beispiel gegeben wurde! Also das ist doch echt... schade.

                EDIT: Oha, Deppelpost. Sorry.

                Kommentar


                • #9
                  - Doppelpost-Fail -

                  Kommentar


                  • #10
                    Mach das hiermit:
                    http://www.phpbar.de/w/Singleton
                    In den Constructor Deiner Klassen baust Du ein

                    PHP-Code:
                    $this->db MeineErsteKleineDatenbankKlasse::getInstance(); 
                    und dann läuft das sehr entpannt. Deine Datenbankklasse extends Singleton.

                    Kommentar


                    • #11
                      Nein, das tust du nicht. Das ist Blödsinn.
                      http://www.just-about.net/boese-singletons

                      Kommentar


                      • #12
                        Hehe, nice Link Ja, Singletons können böse sein, von einer Pauschalisierung würde ich trotz allem Abstand nehmen. Im o.g. Fall würde dieses Pattern das "Problem" effizient lösen. (meine Meinung)
                        Trotzdem vielen Dank für die Ergänzung, ich dachte nicht, dass ich eine Warnung aussprechen müsste

                        Kommentar


                        • #13
                          Nur wozu das? Autowiring ist doch genau so einfach und wesentlich zukunftsorientierter als Singleton...

                          Kommentar


                          • #14
                            Du hast völlig Recht... nur ist das eben "nicht mal kurz" drangeflanscht. Wenn ProjectX007 ein Framework verwenden würde, hätte er heute sicherlich auch nicht seine erste Datenbankklasse geschrieben. Besser geht's immer, ohne Zweifel. Sobald er die Frage noch mal im "Expertenbereich" stellt, könnten wir ihm ja mal ein vernünftiges Framework empfehlen
                            Frage gestellt -> mehrere Antworten bekommen. Denke, er hat jetzt erstmal ne ganze Menge (neue) Dinge zu lesen.

                            Kommentar


                            • #15
                              Diese Fragen finde ich leider immer sehr schwierig „sinnvoll“ zu beantworten, weil „sinnvoll“ im Zweifel haufenweise Infrastruktur benötigt oder zumindest thematisch stark ausfächert. Ich bin ja in meiner ersten Antwort zum Beispiel auch nicht auf die Architektur eingegangen und habe auch kein Interface hinzugefügt oder so was in der Richtung.

                              Wichtig finde ich erst mal, dass unpraktische (weil etwa stark redundante) new-Statements verschwinden.

                              Mir wäre es am liebsten, wenn wir da Singletons auch als „mach das nicht“ vermitteln würden, weil sie etwa oftmals Abhängigkeiten verstecken (genau wie verstreute new-Statements – beides kann irgendwo im Code aus dem Hut gezaubert werden).

                              Als pauschale Faustregel vielleicht: Wenn ein Objekt andere Objekte benötigt, sollten die im Konstruktor übergeben werden. (Da gibt es aber natürlich dann Nuancen.)

                              Kommentar

                              Lädt...
                              X