Klassen - Verwendung, Verknüpfung, ...

  • Also ich ärgere mich hier mit Klassen.
    Das Erstellen ist ja relativ einfach (google ect). Aber ich bekomm "Kopfschmerzen", wenn es darum geht Klassen richtig einzusetzen und schon von Anfang an die Zugehörigkeit bzw Eigenständigkeit festzulegen.


    Wollte mir eine "raw-webpage" basteln. sinn und Zweck des Ganzen: Entpacken, starten - und das wichtigste (db, tables, ordner ...) erstellt sich eigenständig.


    Angefangen hatte ich mit den, was bei jeder Webseite passiert - den Fehler. Also Klasse zu Error-loggen erstelt.
    Passt auch. Die Klasse ist komplett eigenständig und könnte von jedem sofort benutzt werden.


    Das Problem:
    Um so mehr man schreit, desto mehr MUSS (?) man die Sachen miteinander verknüpfen, richtig?


    Als Bsp.:
    1. class FileAccess # schreibt content in file (beim Aufruf von $errors->schreibjetze('text');)
    2. class SQL # alles drin und dran für mysql


    Um beide zu nutzen muss ich sie ja initialisieren(heisst es so?):
    $errors = new FileAccess;
    $sql = new SQL;


    Jetzt mein Problem damit:
    wenn ich im Hauptscript eine sql Query per $sql->... nutze und in der Klasse SQL ein Fehler auftritt,
    dann müsste ich ja $errors in die public function mit rein schicken. Somit ist die Klasse SQL abhängig von der anderen Klasse (FileAccess).


    Hoffe ich konnte mich verständlich ausdrücken :D
    Jetzt die eigentliche Frage: Ist es denn überhaupt möglich alles voneinander unabhängig zu schreiben? Oder ist das scheiss egal?

  • Klassen sollten (für größere Projekte) abstrakt gehalten werden und das ganze System sollte Modular aufgebaut sein.
    Zu deinem Problem .. du könntest die Instanz der Debugger-Klasse mit an die Klasse X übergeben um dort dann Methoden ansprechen zu können.


    ;)

  • Also erzeuge ich keine Objekte wie $sql = new SQL;
    und ich
    ... habs gerade gelesen: http://php.net/manual/de/language.oop5.abstract.php


    Wer hat sich denn das ausgedacht? :D
    Aber - ich verstehs und ich denke das krich ich hin =)
    Wird nur bissl fummelei sein das jetz alles umzuschreiben.


    aber eins versteh ich noch net:

    Zitat

    // Die abgeleitete Klasse zwingen, diese Methoden zu definieren


    Die Klasse, die von der Elternklasse abgeleitet wird, muss diese functions definieren - sonst error?
    Was ist der Sinn dahinter?


  • Naja das meinte ich jetzt nicht mit Abstraktion, nicht direkt. Das was du da verlinkt hast, habe ich mir noch nie angeschaut.
    Mit dem Begriff Abstraktion wollte ich vielmehr darauf hinaus deine Klassen so aufzubauen, dass sie genau eine Aufgabe erledigen und dieses möglichst gut. Und dann mehrere Klassen zu einem größeren Verbinden (Objekteinstanzen gegeinseitig übergeben oder wie auch immer).
    Halt nicht alles in eine Klasse reinstopfen. Zum Beispiel sollte die Klasse für MySQL nicht selbst debuggen in Form von eine Text-Datei befüllen. Dafür gibt es eine Debugger-Class. Und da du nun eine Debugger-Class hast die auf genau eine Aufgabe spezialisiert ist kannst du diese nun auch nutzen um andere Fehlermeldungen zu loggen. Verstanden wie ich das mein(t)e?


    Zurück zu dem Link .. sowas hab ich noch nie gesehen bzw. mich näher damit beschäftigt. Habe nur mal was von Interfaces gehört. Hierfür habe ich ein schönes Beispiel wenn du magst. :thumbup:
    Ich schicks per PN

  • :D ne lass mal - hab mir interfaces angesehen und entschieden, dass ich das jetzt nicht brauche :D


    Aber abstract ist gut. Ich kannte schon "static". Wobei man zB eine function aufrufen kann (ClassName::functionName();), ohne ein object von der class zu erstellen.
    Aber ich denke mit "abstract class" geht noch mehr.
    Hab mal versucht ein grundgerüst zu erstellen:


    Beim errorHandler() bin ich mir wieder nicht sicher. Aber ich muss ja irgentwo irgentwie die "original"-e-message abfangen und weitergeben 8| .


  • Die Klasse, die von der Elternklasse abgeleitet wird, muss diese functions definieren - sonst error?
    Was ist der Sinn dahinter?


    Vorhin überlesen, sorry.


    Ich kann dir das am besten mit einem Interface erklären. xD
    Als Beispiel kann ich dir ein Interface aus dem Android-SDK vorstellen.
    Das ist zwar jetzt Java-Code aber an dieser Stelle nicht kontraproduktiv meines erachtens nach. Geht ja nur um den Ablauf.

    Code
    // Interface wird implementiertpublic class OnClickButtonListener implements OnClickListener{	public void onClick( View v )	{		String text = "Gut geklickt! ;)";		Toast toast = Toast.makeText( v.getContext(), text, Toast.LENGTH_SHORT );		toast.show();	}}


    Der Sinn dahinter ist, dass man eigene Event-Listener schreiben kann, diese müssen aber bestimmte Voraussetzungen haben. Daher implementiert mand as Interface, was in diesem fall zum Beispiel die Methode onClick vorschreibt. So richtig komplett zu 100% habe ich es auch noch nicht verstanden, aber ich hoffe ich konnte es dir ein wenig näher bringen.

  • Von einer abstrakten Klasse kannst du keine Instanzen erstellen (im Gegensatz zur normalen Klasse).
    Deshalb verwendet man abstrakte Klassen, um z.B. so eine Art Prototyp zu definieren, den dann andere Klassen quasi als Grundgerüst verwenden. Dabei kannst du sowohl schon fertige Funktionen/Methoden definieren als auch durch abstrakte Methoden Prototypen definieren, die in der abgeleiteten Klasse auf jeden Fall definiert werden müssen (sonst Fehler).
    Bsp:

    PHP
    abstract class Figur {
    abscract function flaecheBerechnen;
    }
    class Kreis extends Figur {
    // hier muss flaecheBerechnen definiert werden
    }
    class Rechteck extends Figur {
    //hier auch
    }


    Weiß net ob das jetzt 100% stimmt, aber mal so als Idee, warum man überhaupt abstrakte Klassen hat.

  • Ich glaub ja. php.net beschreibt es genauso.
    Was ich oben an php code bsp geposted hab ist übrigens quark in sachen abstract, weil das eher ein bsp für static ist.
    Abstract hat da drin gar keinen sinn :D


    Also ist das was ich brauch static.


    Edit:
    Was haltet ihr von dem "Grundgerüst":



    Ist das korrekt(sinnvoll)?

  • das kommt darauf an was die Klassen miteinander zu tun haben.. es macht grundsätzlich nur Sinn, schon existierende Klassen zu erweitern, wenn diese die Funktionalität der klasse erweitern..

  • Ja, also ich hab mich jetzt doch entschieden es so zu lassen wie es schon war.


    Eine class für sql, welche alle functionen hat, die ich so brauch.
    Query rein, result und/oder fehler raus.


    Um die Fehler zu handeln gibts wieder ne extra class -> fehler rein, loggen ect, fertig.


    Ansonsten würde ich ja die Klassen nur voneinander abhängig machen. Und das will ich ja nicht.
    Ist zwar mehr code im Hauptscript, aber ich kann die Klassen überall nutzen, entfernen usw, ohne dass was passiert.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!