Andreas Korthaus: Objektorientierung in PHP richtig anwenden bei einem Forum

Beitrag lesen

Hallo!

-Themenauflistung
-Threadauflistung
-Threadausgabe + Antwortenausgabe
-Regiestrier Möglichkeit
-Login
-Mehrere Themen
-Bearbeitung eigener Threads/Antworten
-verschiedene User mit verschiedenen Rechten

Ich selber habe mir gedacht, ich könnte eine Oberklasse erstellen die alles enthällt was alle sehen können (= unregistriert/registriert/Admin/...)

und dann jeweils unterklassen für Admin - ( Benutzer hohen Grades, Benutzer mittleren Grades - ... ) - Gast.

Nein, sowas würde ich nicht machen. Versuche eher mal die Objekte aus der der Realität zu modellieren.

Da wären zum einen die User, von denen gibt es 3 verschiedene. Viele SAchen sind bei allen Usern gleich, also alle haben einen usernamen, alle ein Passwort, brauchen eien Methode zum erzeugen, löschen...
und einige User haben besondere Eigenschaften und methoden, z.B. der Admin.

Also würde ich hier mal eine Klasse "User" vorschlagen, und 3 von User erbende Klassen "Admin","Guest","RegisteredUser" oder sowas.

Dann hast Du auf der anderen Seite Threads und Postings, wobei man im Thread-Objekt auch eine Liste mit Referenzen auf die zugehörigen Postings verwenden kann, oder man verwendet eine extra-Klasse für die Zuordnung. So eine Klasse Thread könnte eine Methode "getPostingList()" haben, die die zugehörigen PostingIDs zurückgibt, mit denen Du dann die Posting-Objekte erzeugst, die dann wieder Methoden haben die die entsprechenden Daten für die Ausgabe zurükgeben. Eine andere Variante, die ich vermutlich bevorzugen würde wäre, wenn das Thread-Objekt eine Methode hätte wie fetchPostings(), welche entsprechend die Postings recht performant aus der DB auslesen kann, und der Reihe nach alle Posting-Objekte erzeugen kann. Und dabei die Objekte nur so weit füllen wie sinnvoll/notwendig, bei der Posting-Übersicht braucht man z.B. noch nicht den kompletten Text jedes Postings...

Vielleicht macht auch eine Klasse "Forum" Sinn, die Referenzen auf die Threads enthält. Das Forums-Objekt könnte eine Methode haben wie "getThreadList()", die dann eine entsprechende Liste der Threads zurückgibt, aus der Du die Liste basteln kannst. Oder Du kannst irgendwo eine methode displayThreadList() haben, die das ganze erledigt.
Und wenn Du ein bisschen überlegst findest Du vielleicht noch mehr sinnvolle Objekte.

Da PHP ja leider die Objekte nicht persistent im Speicher hält, und da das bei größeren Datenmengen sowieso nicht geht, musst Du allerdings Kompromisse eingehen. Daher würde ich evtl. nicht überall Referenzen auf existierende Objekte speichern, sondern vielleicht einfach auf eine entsprechende ID, anhand der Du das entsprechende Objekt erzeugen kannst. Oder Objekte immer nur so weit füllen wie Du die Daten brauchst...

Dann solltest Du noch drauf achten, dass Du die Präsentation von der Datenhaltung trennst. Das funktioniert z.B. hervorragend durch Verwendung einer Template-Engine für die Präsentation der Daten, und/oder auf der anderen Seite durch Verwenden von Data-Access-Objects, das heißt in der "Business-Logik" änderst Du nur die Eigenschaften von Objekten, und führst entsprechende Änderungen in der Datenbank selbst über spezielle Objekte/Methoden durch.

Aber versuche nicht alles auf einmal, das wichtigste ist dass Du ein Verständnis für die oben genannten Objekte bekommst, die aus der Realität, denn das ist IMHO der beste Weg OOP zu verstehen, nicht das sture verwenden von Klassen und Objekten nur weil man glaubt es zu brauchen oder weil es andere auch machen.

Jedenfalls gibt es immer viele Wege, man muss einfach mal anfangen und Erfahrungen sammeln. Vielleicht würde ich es alles doch ganz anders machen wenn ich länger drüber nachdenke ;-)

Und die rollen-abhängigen Sachen, das ist recht einfach in der Klasse User zu implementieren. Einfach eine Methode isAdmin() und eine isRegisteredUser(), und entsprechend prüfen wenn da was rollen-abhängig angezeigt oder verändert werden soll.

Wie würdet ihr hier das OOP ausnutzen?

Ehrlich gesagt kommt mir meine Variante als nicht zu sinvoll vor, ob das wahr ist würde sich herausstellen wenn ich das forum mal auf diese Weise mächte.

Sollte ich es überhaupt ausprobieren oder hat das überhaupt keine Sinn eurer Erfahrung nach.

Auf jeden Fall, und Du solltest einiges zu OOP lesen.
Vielleicht nicht nur von PHP, sondern auch von anderen Sprachen, z.B.: http://java.sun.com/docs/books/tutorial/java/concepts/index.html

Aber auch für PHP gibt es gute Arikel...
http://www.php-mag.net/itr/online_artikel/show.php3?id=284&p=0&nodeid=114

Ach ja, noch eine Grundregel, greife NIEMALS von außen auf eine Klassen-Variable direkt zu, also nicht sowas:

class Test {
  var $intern;
}
$test = new Test;
$test->intern = 'SO NICHT';
echo $test->intern;

sowas nicht machen!

Nur so:

class Test {
  var $intern;

function setBla($new_val) {
    $this->intern = $new_val;
  }
  function getBla() {
    return $this->intern;
  }
}
$test = new Test;
$test->setBla('NUR SO');
echo $test->getBla();

Viele Grüße
Andreas