Thorsten Steffen: Modulares Programmieren mit PHP

Beitrag lesen

Hio Andreas,

Ich sitze zur Zeit an ähnlichen Problemen, und hatte dazu vor einigen Tagen einen recht fruchtbaren Thread gestartet: http://forum.de.selfhtml.org/archiv/2002/12/31778/

diesen Thread hab ich mir nun mal ein wenig durchgelesen.
Es sind sehr interessante Anregungen und Tipps dabei, wobei der "Übergang" von der Theorie in die Praxis trotzdem noch einmal eine Sache für sich ist ;)

Aber meiner Meinung nach ist die Modularität das genaue Gegenteil. Ein Modul soll ganz klar definierte Schnittstellen haben. Das Modul soll sich nicht alles möglicsh alleien beschaffen, sondern sich alle Daten aus anderen Modulen hoolen, oder die Daten sollen von anderen Modulen übergeben werden.

hm, ja und nein. Ich verstehe Module auch als eine Art "Stecksystem", vergleichsweise mit Lego ;) Aber ich bin der Meinung, ein Modul sollte eine klar definierte Aufgabe haben und diese eigenständig ausführen können. Z.b. die fileUpload-Klasse, sie soll Dateien vom tempörären Verzeichnis nach x verschieben. Zu entscheiden ob diese Datei nun zu gross oder falsches Format ist, ist alleinige Aufgabe dieser Klasse und keiner anderen. Wenn ich nun z.b. ein Thumbnail erzeugen möchte oder nach Viren checken möchte, dann komme ich in einen anderen Aufgabenbereich als die Kernaufgabe dieser Klasse. Dann benötige ich andere Klassen für diese Aufgabe und an dieser Stelle klar definierte Schnittstellen damit diese Klassen kommunizieren können.

Die Idee halte ich nicht für gut. Die Error-Klasse sollte ein eigenes Modul sein, welches Du in den anderen Modulen verwenden kannst, oder auch nicht.

Sehe ich nun auch so, wie gesagt, meine erste Idee war sie als Basisklasse zu verwenden, gerade weil Fehler überall auftreten können. Nun strebe ich eine andere Lösung an. Ich verpasse der fileUpload-Klasse eine Funktion, welche bei Bedarf eine Instanz von errorReprting erzeugt und mit dieser Kommuniziert.

z.b.
function setErrorMessage() {
  if (isset($this->errorHandler)) $this->errorHanlder = newErrorReprting;
  $this->errorHandler->setErrorMessage(10,"FILE_NOT_FOUND","Datei x.gif wurde nicht gefunden");
  }

Meine aktuelle Überlegung ist, nun die wesentlichen Funktionien direkt in den scope der Klasse mit get_object_methods zu importieren,
aber so sicher bin ich da nicht.
Der Vorteil, sie nicht als Basisklasse sondern zu Instanzieren ist denke ich, ich kann mehrere errorReport-Instanzen mit verschiedenen Aufgaben erzeugen, anstatt nur _eine_ Fehlerbehandlung.

Ich würde in das Modul vielleicht auch für jeden Typ eine extra Methode schreiben, ich habe z.B. auch Excel-Dateien, das würde ich ganz anders prüfen als eine JPG-Datei.

hm, ist natürlich eine Überlegung wert, die Frage ist ob man das über eine Zwischenklasse macht oder nicht.
z.b.
fileUpload   ->  fileAnalyser   -> excelFiles
oder so

class fileUpload extends errorReporting {

function createThumb() {
    $this->createThumb = new thumbnail();
    ....
  }

Wie gesagt, ich würde das anders machen, da das so auch unlogisch ist, und Module sollen ja logisch sein. Was hat das kopieren von Bildern in einem Error-Modul verloren?

Würde ich aktuell auch, wobei ich das aber als fileUpload-Modul gesehen habe, welches ein Fehlermodul besitzt, den auch beim erzeugen von Thumbs können Fehler auftreten, z.b. "GIF NOT SUPPORTED"

Aber wie mache ich das jetzt mit dem Basis-Modul? Das kann iach mir nicht vorstellen. Vielleicht frage ich _jedesmal_ (duch einbinden der Basis-Klasse in alle Scripte) mit if($_FILE) und wenn das TRUE ist dann  binde ich halt die file-upload Klasse ein. Aber das müßteman dann ja mit jedem einzelnen Modul machen. Gibt es da keine bessere Lösung?

Ich finde die Idee mit einem Basismodul als elementares Grundmuster erstmal nicht so gut, hab solche Vorschläge schon mehrfach gehört. Aber ein ich denke, letztendlich wird man kein System erstellen können, das jede erdenkliche Aufgabe lösen kann. Also wird man ein Problem in der Praxis angehen, indem man rund um seine Module programmiert, die vielleicht ja irgendwann viele Standardaufgaben automatisiert erfüllen.

Das würde ich sowieso machen, das wäre ja ein tierischer Overhead wenn man immer alles laden würde, nur wie man das in der Praxis mit PHP sauber macht ist mir nicht nicht wirklich klar. Oder könnte hier "::" helfen, also Methoden nutzen ohne Instanz?

Ich denke teilweise schon.

Ich mache mir gerade megaviele Gedanken, wie ich Klassen so gestalten kann, die sie so eigentständig wie möglich funktionieren und welche Aufbau wirklich sinn macht. Vielleicht kann jemanden ein paar Tipps geben, der sich schon intensiver damit auseinandergesetzt hat, oder kennt ein Tutorial das nicht auf Einsteigerniveau liegt, davon gibts genug.
Das ist schwer, ich komme da auch nur schleppend weiter, das hört sich immer so klar und logisch an, was die Christians oder Sven zu dem Thema sagen, nur wenn ich danach da sitze und das umsetzen will stehe ich da und weiß nicht wo und wie ich ansetzen soll. Theoretisch habe ich es denke ich langsam verstanden, jetzt muß ich das nur noch in der Praxis umsetzen können, was nicht ganz so einfach ist.

Hehe ;) das kenne ich. In der Theorie sieht vieles immer sehr gut aus, in der Praxis dann "anders".
Ich versuche mir momentan damit zu helfen, indem ich "Kernaufgaben" sehe. Z.b. hinterfrage ich bei jedem Feature der fileUpload-Klasse ob dies wirklich zur Kernaufgabe gehört oder nicht, z.b. thumbnails, klares nein, also überlege ich in welchen Kernaufgabenbereich gehört dieses Problem und welche Klasse (Modul) sollte dies lösen.

Mein Kopf raucht bestimmt genauso wie deiner ;)

gl & hf

Thorsten