Strukturierung von Klassen, includes, OOP

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Strukturierung von Klassen, includes, OOP

    Moin zusammen!

    Da mir das Forum sympathisch ist, hab ich mich direkt mal angemeldet um meine Frage loszuwerden.
    Ich programmiere noch nicht so lange in php, habe aber während des Studiums Java gelernt und mir selber objective-c ein wenig beigebracht.

    Vor einem halben Jahr habe ich ein Projekt angefangen, welches mit der Zeit sehr unübersichtlich geworden ist. Es besteht eigentlich aus zwei Teilen, einer iOS Applikation und einer Webseite. Hier dreht es sich natürlich nur um die Website.
    Zu Beginn war es noch relativ einfach, da brauchte es drei Dateien mit einer Klasse. Jetzt ist es aber so, dass die eine Klasse die tausend Zeilen sprengt und das scheint mir nicht besonders toll gelöst zu sein. Vermutlich ist es nicht die beste Idee es im Nachhinein zu machen, aber ich seh da grad keine andere Möglichkeit.

    Wie teile ich am besten meine Klassen auf?
    Habe mir Gedanken gemacht welche Funktionen in welche Klasse soll. Das ergibt bei mir 4 Klassen:
    1. users.class.php
    2. orders.class.php
    3. pharmacy.class.php
    4. db.class.php


    Pro Datei eine Klasse, so weit komme ich noch. Jetzt kommt aber ein wenig mein Unwissen ins Spiel.
    Jede der Klassen braucht die Funktionen aus der Datenbankklasse und teilweise auch was aus den anderen. Ist dann schon die Strukturierung / Aufteilung der Klassen falsch? Wie ist das realisierbar? Ich kann doch nicht doppelt / dreifach eine Datei includen ohne das was schief geht?
    Habe Gestern versucht mich ein wenig mit __autoloader() bzw. spl_autload_register() zu beschäftigen, bin aber auch nicht 100% schlau draus geworden.

    Vielleicht kann noch ein kleines Beispiel helfen:

    Die Klasse orders hat eine Funktion addOrder() die eine Bestellung in die Datenbank schreibt, welche aber mit einem bestimmten User verknüpft ist.
    addOrder() macht also folgendes:

    Quellcode

    1. <?php
    2. // php-pseudo-mischcode
    3. class orders {
    4. addOrder($image, $data, $userid, $pharmaid) {
    5. $user = new users($userid);
    6. $db = new db();
    7. $username = $user->getUsername();
    8. $query = "INSERT INTO orders (image, data, username, pharmaid) VALUES ($image, $data, $username, $pharmaid)";
    9. $db->query($query);
    10. }
    11. }
    Alles anzeigen


    Oder ist es vollkommener Quatsch mit Klassen und Objekten zu arbeiten? Man könnte ja auch immer alle Dateien mit den Funktionen einzeln includen und diese stehen dann zur Verfügung?

    Hoffe meine Fragen sind deutlich geworden,
    Gruß emmi
  • Wie teile ich am besten meine Klassen auf?
    Habe mir Gedanken gemacht welche Funktionen in welche Klasse soll. Das ergibt bei mir 4 Klassen:

    1.users.class.php

    2.orders.class.php

    3.pharmacy.class.php

    4.db.class.php


    Zunächst mal ist es nicht sinvoll unötig Wiederholungen bei den Dateinamen zu machen. Das .class kanst du getrost weglassen. Stattdesen leg die Files in einen seperaten Ordner zum Beispiel: class
    Ein weiterer Wichtiger Punkt ist die Namensbenneung der Datein. Wenn du mit __autoload() arbeitest ist das un umgänglich.
    Am besten ist es wenn die Datei genauso heißt wie die klasse selbst. Daher wird die Klasse user dann als Dateiname user.php gespeichert und so weiter.

    Ein autoload() Beispiel hier:

    Quellcode

    1. <?
    2. define ('DIRSEP', DIRECTORY_SEPARATOR); // Für Linux Kompatibele Slash Operatoren Constants:
    3. define ('path',dirname(__FILE__).DIRSEP);
    4. # Automatisches Laden der Klassen Files
    5. function __autoload($class_name)
    6. {
    7. $filename = strtolower($class_name);
    8. $file = path .'classes' . DIRSEP . $filename. '.php';
    9. if (file_exists($file) == false)
    10. {
    11. return false;
    12. }
    13. include_once($file);
    14. }
    Alles anzeigen


    Dann geb ich dir noch den Tip und schau dir mal die verschiedenen Pattern arten an.
    Eine Datenbank Klasse würd ich als Singleton aufbauen. Du kannst aber auch die Factory Methode verwenden.
    Beispiel findest hier letzter Forum eintrag : tutorials.de/php/360499-instan…rer-klasse-verwenden.html

    Zur Struktierung und Übersicht empfehle ich dir das MVC Schema (Model View Controller).
    Und gewöhnt dir an Zeilen umbrüche in deinen Quellcode zu machen und vorallem auch bei Sql befehlen!

    Ps. Dein geposteter Quellcode kann so nicht funktioniern hast du den überhaupt getestet?

    Mfg Splasch

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von splasch ()

  • Hi,

    nein der Code wird nicht laufen. Hab es ja schon im Kommentar angedeutet. Ist mehr ein pseudocode auf php Basis um es zu verdeutlichen. Die Datenbankklasse ist ein Singleton, habs ja nur sehr verkürzt dargestellt.
    Welche Pattern im speziellen meinst Du denn? Factory generell oder war das nur für die Datenbankklasse gedacht?
    Wenn ich MVC nun auf mein Projekt beziehe habe ich doch die Datenbankklasse(n) als Model, das Design als View und den Controller als Schichten zwischen den beiden. So ist eigentlich auch alles aufgebaut, allerdings mischen sich noch Model und Controller zusammen in den Dateien.
    Die Dateinamen sind mir heute Nacht irgendwie so eingefallen. Die Methode fürs autload würde dann das .class immer mit einfügen, die Klassen heißen aber wie die Dateien.

    Danke für das Beispiel für __autoload(), so habe ich es auch verstanden. Was mir aber nicht klar ist: Ist es hier sinnvoll? Oder reicht es auch wenn ich die paar Klassen immer include und nicht "on-demand"?
  • include würd ich keinen Fall empfehlen aufjedenfall mit dem Autoloader arbeiten wenn du wirklich OO schreiben willst. Erspart nee menge Arbeit.
    So kannst du überall auf die Klassen zugreifen ohne dir Gedanken machen zu müssen ob diese schon eingebunden wurde oder nicht.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von splasch ()