abstract - interface ?

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

  • abstract - interface ?

    Hi,

    Ich hab ein bisschen Probleme mit den OOP Begriffen abstract und interface.

    Soweit ich das bis jetzt verstanden hab ist interface eine Art Schablone für eine Klasse, die sicherstellt, dass eine implementierte Klasse genauso so aufgebaut ist, wie es die Schablone vorgibt.

    Bei abstract sind nicht alle Methoden vorgegeben sondern es können auch eigene Methoden enthalten sein.

    So warum ich mich damit auseinandersetze ist folgendes:
    Ich möchte mehrere Datenbanksysteme mit einer Klasse ansprechen können.
    Diese Klasse heißt bei mir einfach DB und gibt die Struktur wie z.B. die Methoden connect(), query(), close() usw. vor.
    Da ich in der DB Klasse noch eine nicht vorgebene Methode habe nehme ich also abstract und gebe die oben gennanten Methoden vor.

    Das ganze funktioniert aber nicht so wie ich es gerne haben möchte. Ich hätte gerne eine Klasse DB die "überschreibare" Methoden enthält, eine Methode der Klasse DB überprüft welches Datenbanksystem benutzt werden soll und includet dann die Datei mit der entsprechenden Klasse nehmen wir als Beispiel mal MySQL. Es wird also die mysql.php Datei eingebunden diese überschreibt durch den "extends" Befehl die Methoden der DB Klasse. Soweit so gut ich möchte nun also einfach auf die Methoden der Klasse DB zugreifen die nun ja die richtigen Methoden für das DBsystem enthalten aber da diese ja abstract ist geht das nicht...

    Könnt ihr mir vll helfen, hab ich irgendwas falsch verstanden oder gibt es einen Weg das zu umgehen?

    Checker

  • #2
    Re: abstract - interface ?

    Original geschrieben von PHP-Checker
    So warum ich mich damit auseinandersetze ist folgendes:
    Ich möchte mehrere Datenbanksysteme mit einer Klasse ansprechen können.
    Wahnwitz ... der SQL-Standard ist nicht in jeder DBMS korrekt umgesetzt, bzw. teilweise erweitert etc. d.h. du musst auch alle Queries abstrakt halten ... willst du dir das wirklich antun?

    Da ich in der DB Klasse noch eine nicht vorgebene Methode habe nehme ich also abstract und gebe die oben gennanten Methoden vor.
    Verstehe ich nicht die Begründung. Es geht doch auch ein
    PHP-Code:
    <?php

    interface db {
        function 
    query();
    }

    class 
    mysql implements db {
        function 
    neue_methode() {
            
        }
    }
    Das ganze funktioniert aber nicht so wie ich es gerne haben möchte. Ich hätte gerne eine Klasse DB die "überschreibare" Methoden enthält, eine Methode der Klasse DB überprüft welches Datenbanksystem benutzt werden soll und includet dann die Datei mit der entsprechenden Klasse nehmen wir als Beispiel mal MySQL. Es wird also die mysql.php Datei eingebunden diese überschreibt durch den "extends" Befehl die Methoden der DB Klasse. Soweit so gut ich möchte nun also einfach auf die Methoden der Klasse DB zugreifen die nun ja die richtigen Methoden für das DBsystem enthalten aber da diese ja abstract ist geht das nicht...
    D.h. du willst praktisch eine bestehendes Objekt runtime-mäßig abändern? Geht nicht.

    Vllt. eine Funktion, welche je nach DB-Typ ein entsprechendes Objekt instantiiert und zurück liefert, oder die Basis-Klasse bekommt einen statischen Konstruktor, dann geht allerdings keine abstrakte Klasse mehr und ein Interface erst recht nicht ... tjo

    Such mal in PEAR nach der DB-Klasse, vllt. ist das was für dich

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      Hi,

      Ein Interface gibt vor, welche öffentlichen Methoden ein Objekt haben muss, aber es verbietet dir nicht, auch weitere zu benutzen. Ansonsten wären auch keine privaten Methoden machbar, denn ein Interface zeigt ja nur öffentliche Methoden an.

      Es macht auch Sinn, für die verschiedenen DB Klassen ein Interface zu verwenden. In deinem Programm verwendest du dann ein DB Objekt, von dem du während der Programmierung nur weißt, dass es dein Interface implementiert. Je nachdem, welche DB in deiner Konfiguration bestimmt wurde, erzeugst du ein entsprechendes DB Objekt und fertig.
      Das könnte dann so aussehen:

      PHP-Code:
      $database Factory::get_database(DATABASE);
      $database->connect(); 
      Gruß Thomas

      Kommentar


      • #4
        @ghostgambler

        Du hast mich total falsch verstanden. Ich möchte nicht den SQL Standard ändern der ist perfekt und wird von jeder DB benutzt da gibt es nicht zu ändern.

        Was ich möchte ist die Datenbankabfrage vereinfachen. Bei jeden DBSystem hast du folgende Struktur connect -> query -> close aber in jedem DBSystem wird das durch einen anderen PHP Befehl realisiert.
        Z.B mysql_connect(); mssql_connect(); pg_connect()

        Und da alle Abfragen in sämtlichen DBs durch SQL geschieht kann man das eben auch vereinfachen. Das ermöglicht nun ein PHP-Programm egal welches DBSystem auf einem Server vorhanden ist zum laufen zu bringen, da die Datenbankstruktur auf jeder DB gleich bleibt und alle die gleichen SQL-Abfragen verwenden.

        @Alrik: Danke genau das hatte ich gesucht :-)

        Kommentar


        • #5
          Original geschrieben von PHP-Checker
          und alle die gleichen SQL-Abfragen verwenden.
          Das tun sie eben ggf. nicht.
          Auto-Increment ist zum Beispiel einer der Knackpunkte, da nicht von jedem DBMS unterstützt ... nur mal als Beispiel, es gibt auch so Spielereien wie JOINS über mehrere Tabellen, die nicht mal zwischen mysql4 und mysql5 konstant eine Syntax haben

          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
          Wie man Fragen richtig stellt

          Kommentar


          • #6
            Auto-Increment ist zum Beispiel einer der Knackpunkte, da nicht von jedem DBMS unterstützt ... nur mal als Beispiel, es gibt auch so Spielereien wie JOINS über mehrere Tabellen, die nicht mal zwischen mysql4 und mysql5 konstant eine Syntax haben
            Solche Dinge sollte sich der nutzer dann natürlich überlegen, ob er die DB-übergreifende Lösung nutzen möchte oder halt bei einem system bleibt. Hat allerdings nichts direkt mit der Frage zu tun...

            Kommentar

            Lädt...
            X