NoFollow Free!
SHIFT Weblog

Dieses Blog ist ein Online-Magazin für erfahrene Website-Entwickler und Webdesigner, die PHP und Webdesign lieben.

Tag: oop

PHP

Mein Verständnis von MVC

mvc_v

MVC – diese drei Buchstaben haben es in sich. MVC ist ein Design Pattern, eine strukturelle Lösung für Entwickler. Kaum ein anderes Design Pattern löst so viel Kontroverse aus und regt zu endlosen Diskussionen an – zumindest in der PHP-Welt.

Das liegt daran, dass MVC recht oberflächlich beschrieben wird, und möchte man sämtliche MVC-Erklärungsversuche zusammenfassen, so ist man schnell der Auffassung:

  • Model (M) : Die Verbindung zur Datenbank
  • View (V) : Die Ausgabe an den Benutzer
  • Controller (C) : Der Verwalter zwischen den Schichten

Die Wahrheit ist aber: Es ist viel mehr als das. Der große Fehler, den MVC-Neulinge dabei begehen, ist, ihr Projekt nur nach diesen Gesichtspunkten zu gestalten. Oft wird übersehen, dass MVC nur eines von mehreren Zahnrädern in einer ganz anderen Schichtenarchitektur ist: Der Präsentationsschicht, der Logikschicht (auch als Businessschicht bezeichnet) und der Persistenzschicht. MVC agiert in allen drei Schichten, hauptsächlich jedoch in der Präsentationsschicht. Verfolgt man MVC-Diskussionen in gängigen Foren, kommt erschwerend hinzu, dass jeder MVC etwas anders auslegt. Es gibt also nicht selten kein “richtig” oder “falsch”. Die Grenzen, die MVC versucht aufzuzeigen, scheinen paradoxerweise ineinander zu verschwimmen.

Ich versuche, mit diesem Artikel dem Verständnis von MVC auf die Sprünge zu helfen, ich betone aber, dass dies nur meine Auffassung des Patterns ist. Ich möchte daher nicht deutlich machen, dass meine Ansicht die richtige oder die falsche ist – es ist eher ein mögliches Konzept zur strukturellen Realisierung von MVC. Außerdem liefere ich hier kein MVC-Tutorial, die allgemeine Funktion des Patterns sollte bekannt sein.

Weiterlesen ›

PHP

Ausnahmezustand: PHP und Exceptions

Exit

Mit PHP 5 wurde dem Entwickler ein Werkzeug zur Verfügung gestellt, dass es in anderen objektorientierten Sprachen wie C++ und Python schon lange gibt: Exceptions. Mit diesen hat der Entwickler die Möglichkeit, auf ungewollte Ereignisse zu reagieren. Exceptions werden “geworfen”, das bedeutet, sie unterbrechen den normalen Programmfluss und behandeln eine eventuelle Ausnahme, die den weiteren Programmverlauf stören können. In einer Desktopapplikation beispielsweise könnten Exceptions genutzt werden, um noch vor dem Windows-Fehlermeldungsfenster ein eigenes zu generieren, in der der Benutzer die Möglichkeit hat, einen Fehlerbericht an die Softwarefirma zu schicken. Ohne diese Ausnahmebehandlung würde das Programm mit einer Windows-Standardmeldung sang- und klanglos abstürzen und der User wäre verwirrt. Auch in PHP lassen sich Exceptions sinnvoll nutzen. Mit Exceptions sind sicherlich schon einmal alle Entwickler in Berührung gekommen, die ein MySQL-Statement via PDO mit einer fehlerhaften Syntax abgegeben haben.

Im unten aufgeführten Beispiel mal ein ganz einfacher Anwendungsfall – zunächst ohne Fehlerbehandlung: Aus einer Zahl soll eine Wurzel gezogen werden:

$a = sqrt(9); // Wert von $a: 3
$b = sqrt(-9); // Wert von $a: NaN

Weiterlesen ›

PHP, Quickies

How-To: Objekt mit unbekanntem Klassennamen erstellen

Im Bereich der objektorientierten PHP-Entwicklung kann es vorkommen, dass eine unbekannte Klasse aufgerufen werden muss. In einer Factory-Klasse beispielsweise muss man Objekte mit unbekannten Namen und unbekannter Anzahl an Parameter erzeugen.

Ein erster Schritt könnte dieser Versuch sein:

$variable_classname = 'MeineKlasse';
$instanz = new $variable_classname;

Soweit, so gut. Jedoch könnte man Schwierigkeiten haben, wenn dem Konstruktor noch Parameter überladen werden müssen. Da Klassennamen und somit auch die Klassen unterschiedlich sind, könnte jede dieser Klassen eine unbekannte Zahl an Parameter erhalten.

Dann gibt es ja auch noch die Funktion call_user_func_array. Damit könnten wir folgendes anstellen:

$parameter = array('Foo', 'Bar');

$instanz = new MeineKlasse();
call_user_func_array(array('MeineKlasse', '__construct'), $parameter);

Jedoch ist diese Funktion nur sinnvoll, wenn bereits eine Instanz des Objektes besteht. Das bedeutet aber, dass alle erwarteten Konstruktorparameter nur optional sind – und dies ist bei den wenigsten Konstruktoren der Fall. Folgende Idee funktioniert nicht:

$parameter = array('Foo', 'Bar');
call_user_func_array(array(new MeineKlasse, '__construct'), $parameter);

call_user_func_array ist also leider nicht wirklich in der Lage, direkt ein neues Objekt mit unbekannter Parameteranzahl zu erzeugen und dabei den Konstruktor aufzurufen. Was also tun?

Hier findet sich ein nützlicher Einsatz für sogenannte Reflektionsklassen (Reflection Class). Eine Reflektionsklasse könnte als fast untätiges Spiegelbild eines Klassennamens angesehen werden. Und so können wir mit Hilfe einer Reflection Class unser Vorhaben verwirklichen:

$rc = new ReflectionClass('MeineKlasse');
$class = $rc->newInstanceArgs(array('Foo', 'Bar'));

echo $class->tuIrgendwas();

PHP

Namensräume: PHP Namespace Tutorial

Telefon

Jeder PHP-Entwickler, der sich schonmal durch den Quellcode umfangreicher, objektorientierter Projekte wühlen musste oder Einführungen zu selbigen angesehen hat, wird festgestellt haben dass mittlerweile alle mit den sogenannten Namespaces arbeiten, die mit PHP Version 5.3.0 eingeführt wurden. Weil für jedes Projekt ein eigenener Namensraum definiert werden kann, kommt es so hinterher nicht zu möglichen Namenskollisionen: Ohne eigenen Namespace dürfte jeder Klassenname nur einmal während der Laufzeit vorkommen. Mit intelligent gestalteten Namespaces ist es auch möglich, innerhalb eines Projektes weitere “Unter-”Namespaces zu vergeben. Soweit die Theorie.

Denn ich habe bisher, obwohl ich schon lange objektorientiert arbeite, die Namespaces nie richtig verstanden. Dies liegt zum zum Teil aber auch daran, dass ich noch nie die Motivation hatte, mich damit zu beschäftigen. Jetzt, wo ich an meinem eigenen Framework arbeite, wollte ich dieses nützliche Feature allerdings nicht in meinem Projekt außen vor lassen. Zugegeben, mit der Einführung von PHP Namespaces auf der offiziellen Dokumentationsseite habe ich nicht viel anfangen können, erst durch einige Forenbeiträge und Online-Lektüren konnte ich für mich selbst das “Geheimnis” der Namespaces lüften. Dieses möchte ich euch nicht vorenthalten.

Weiterlesen ›

PHP

PHP: OOP-Crashkurs, Teil 2

oopcc

Was bisher geschah…

Im ersten Teil des OOP-Crashkurses haben wir gelernt, was (statische) Klassen und Objekte, Konstruktoren, Eigenschaften und Methoden sind. In diesem Teil versuche ich zu vermitteln, was magische Methoden sind und wie man die Sichtbarkeit der Klassenelemente verwaltet.

Inhalt:

Weiterlesen ›