Sven Rautenberg: MVC | :: vs. ->

Beitrag lesen

Moin!

Hallo Forum,

ich versuche mir MVC zu erarbeiten und dabei OOP zu verstehen.

Zu MVC könnte ich direkt einen längeren Beitrag schreiben, der im Endeffekt dazu kommt, dass man im Webumfeld keinerlei MVC machen kann. Das Prinzip von MVC ist erfunden worden, um eine Lösung für ein Datensichtproblem zu bekommen: Wenn ich einunddieselben Daten an zwei oder mehr verschiedenen Stellen auf dem Bildschirm habe und an beiden Stellen bearbeiten können will, oder an einer Stelle bearbeiten und die Auswirkungen an allen anderen Stellen sehen will - dann ist MVC geeignet.

Der View ist das Erscheinungsbild der Daten. Also beispielsweise ein Temperaturmesswert als Zahl, oder derselbe Wert als Punkt in einer Temperaturverlaufsgrafik.

Das Model enthält die Daten selbst. Also die Speicherform, die geeignet ist, um die Daten irgendwo abzuspeichern und wieder einzulesen.

Und der Controller ist zuständig für die Zusammenarbeit zwischen View und Model.

Manipuliert der Benutzer in einer View einen Datensatz, meldet der View dies an den Controller. Dieser veranlasst im Model die damit einhergehende Operation. Und das Model informiert dann die View über die aktualisierten Daten - nicht der Controller! Vor allem aber: Model, View und Controller sind im originalen Konzept von MVC auf derselben Maschine - alleine damit geht MVC schon mal nicht im Web, denn wenn "die View" im Browser stattfindet, ist das garantiert eine andere Maschine, als die, wo Controller und Model liegen. Und deshalb kann das Model auch nicht die View über Datenupdates informieren.

Das, was man im Web unter MVC großteils versteht, ist dies:
View: Irgendwas mit Templates.
Controller: Kommunikation mit dem Browser, Erkennen und Abarbeiten von User-Befehlen (-Klicks) und -Eingaben.
Model: Verbindungsschicht zur Datenbank.

Das hat mit objektorientierter Programmierung allerdings alles nicht zwingend zu tun. Im Gegenteil wirst du beim Versuch, OOP zu verstehen, durch Betrachtung von MVC vermutlich eher "versaut" - zumindest wenn du schlechte Tutorials liest, oder unkritisch Frameworks benutzt.

Ich habe mir diverse Beispiele angesehen, anhand derer das Prinzip MVC erklärt wird. Alle haben eines gemein:

  • In der Boostrap wird eine Instanz $controller = new Controller() gebildet;
  • In der Klasse Controller() wird mir this-> auf Methoden oder Eigenschaften der Instanz zugegriffen.
  • Im Controller steht wird eine Instanz $view = new View() gebildet;
  • In der Klasse View() wird mit this-> auf Methoden oder Eigenschaften der Instanz zugegriffen.

Beim Model wird anders verfahren. Hier und nur hier gibt es die Notation :: und in der Klasse wird gibt es sowohl folgende Notation this->Eigenschaft aber auch self::$Eigenschaft

Warum sieser Unterschied?

Weil das Tutorial blöd ist.

Irgendwer hat sich dort gedacht: Hm, das mit dem Model muss rein, aber damit macht man ja meist Datenbankzugriff. Das wiederum ist zu kompliziert für das Beispiel, also: Daten fest im Model als PHP-Code ablegen. Aber man will ja nicht mit jeder Instanz eine neue Kopie der Daten haben. Also wurde anstatt einer Instanzvariablen eine statische Klassenvariable genommen.

Das ist nichts anderes als eine globale Variable. Und damit absolut unschön! Vermeide sowas, wenn du OOP machen willst, denn OOP arbeitet - daher der Name - mit OBJEKTEN. Statische Variablen gehören aber zu keinem Objekt, also sind sie nicht objektorientiert. Sie gehören zu einer Klasse - sie sind allerhöchstens also klassenorientiert.

- Sven Rautenberg