Ankündigung

Einklappen
Keine Ankündigung bisher.

Eigene vererbte PDO Klasse

Einklappen

Neue Werbung 2019

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

  • Eigene vererbte PDO Klasse

    Hallo Leute!

    Ich habe hier mal eine Frage an euch Profis.

    Ich möchte gerne eine eigene PDO Klasse erstellen, welche meine eigenen und die Hauseigenen PDO Methoden beinhaltet.
    Eigentlich ja recht einfach mittels Vererbung zu machen => "class Database extends PDO"

    In meinem MVC Project brauche ich die Datenbankklasse aber recht oft,
    daher wollte ich euch fragen, ob ich hier eine Singleton Klasse erstellen soll, oder eine normale Klasse mit persistenter Verbindung "PDO::ATTR_PERSISTENT => true" reicht.

    Bei der Singleton hätte ich eben das Typische Problem, dass ich mache Sachen wieder zurücksetzten muss

    Wie macht ihr das so?
    Welche Variante ist besser?

    <?php
    $DBObj = Database::getInstanze();
    oder
    $DBObj = new Database();
    ?>

    Danke für eure hilfe

  • #2
    Würde ein normales Objekt machen und das wo immer du es brauchst als Parameter hinein reichen ("depency injection / DI"). Singletons haben sich eher als AntiPattern etabliert.
    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      Danke für die Antwort

      Zitat von hausl Beitrag anzeigen
      Würde ein normales Objekt machen und das wo immer du es brauchst als Parameter hinein reichen ("depency injection / DI"). Singletons haben sich eher als AntiPattern etabliert.
      Wie meinst du das genau?

      Ich würde dann bei jeder Datenbank Abfrage sogesehen das Objekt erstellen.

      $DBObj = new Database();
      $DBObj->prepare('asdf') ...

      $DBObj->clear();

      Kommentar


      • #4
        Nein, schau mal hier: "Beispiel Klasse": http://php-de.github.io/jumpto/pdo/#verbindung-param Hier wird die DB-Verbindung bsp. in eine User-Klasse übergeben.

        Das:
        PHP-Code:
        $DBObj = new Database(); 
        machst du genau einmal in deiner Anwendung (pro DB, also üblicherweise eine DB, eine Verbindung).

        Du erstellst einmal dein Objekt und das übergibst du überall hinein wo du es brauchst. Man kann ja auch Objekte die "normale" Parameter in Methoden hinein übergbeben, also dorthin wo man die DB-Verbindung braucht.
        The string "()()" is not palindrom but the String "())(" is.

        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar


        • #5
          Genau so hab ich es in meinem Project gemacht, leider müssen aber manchmal meine eigenen Eigenschaften rückgesetzt werden, und das ist manchmal etwas nervig

          Im Internet habe ich oft gelesen das man gerne DB Klassen als Singleton schreibt um eben eine Verbindung aufrecht zu lassen.
          Hier habe ich aber auch das Rücksetzproblem.

          Weiters habe ich gelesen, dass PDO mit der Funktion "PDO::ATTR_PERSISTENT" auch Verbindungen offen läßt.
          Sogesehen ist dann das Singleton überflüssig oder?

          Kommentar


          • #6
            Ich würde dann bei jeder Datenbank Abfrage sogesehen das Objekt erstellen.
            es reicht völlig, wenn man am Anfang / beim ersten Mal (lazy load) das Verbindungsobjekt erstellt. danach einfach immer nur herumreichen.

            bzgl. PDO beerben: bei PDO gibt es eine konsequente Trennung zwischen der Verbindung (PDO) und den Queries (PDOStatement). Daher ist es nicht zwangsläufig sinnvoll die Methoden von PDOStatement ins Verbindungsobjekt zu coden. Genausowenig haben datenbankspezifische Queries etwas im Verbindungsobjekt zu suchen. In diesem Falle solltest du eine Klasse erstellen, die PDO als Verbindung benutzt. Bedenke außerdem, daß beide Klassen viele nützliche Funktionen und Features (über ein Dutzend Fetch-Modes, natives Iterieren, Error handling) haben, die man sich anschauen sollte bevor man sich doppelte Arbeit macht.

            Kommentar


            • #7
              Zitat von Flash01 Beitrag anzeigen
              Genau so hab ich es in meinem Project gemacht, leider müssen aber manchmal meine eigenen Eigenschaften rückgesetzt werden, und das ist manchmal etwas nervig
              Kannst du diesen Punkt mal etwas ausführlicher erklären? Ich glaube, du bist mit dieser Anforderung recht alleine auf dieser Welt.


              Zitat von Flash01 Beitrag anzeigen
              Im Internet habe ich oft gelesen das man gerne DB Klassen als Singleton schreibt um eben eine Verbindung aufrecht zu lassen.
              Ja, weil bei PHP die Einstiegshürden gering sind gibt es leider sehr viel Halbwissen im Netz...

              Kommentar


              • #8
                Zitat von rkr Beitrag anzeigen

                Kannst du diesen Punkt mal etwas ausführlicher erklären? Ich glaube, du bist mit dieser Anforderung recht alleine auf dieser Welt.
                Also ich habe zurzeit eine Eigene Datenbank Klasse welche von PDO erbt, hier setze ich je nach Gebrauch ein paar Eigenschaften.
                Diese wiederum bringen in der nächsten Abfrage Fehler mit.
                Darum muss ich vor jeder Abfrage die Eigenschaften zurücksetzt.

                Und ich merke gerade dass ich die ganzen eigenen Eigenschaften und Methoden eigentlich gar nicht brauche

                Ich werde es weiterhin mit depency injection machen und die Hauseigenen PDO Methoden benutzen

                Kommentar

                Lädt...
                X