PHP/Objektorientierte Programmierung

Aus Mikiwiki
< PHP
Zur Navigation springen Zur Suche springen

Objektorientiert zu programmieren setzt voraus, dass die dahinter liegenden Paradigmen verstanden wurden. In der realen Welt ist alles ein Objekt; jedes Ding besteht aus einem Zustand, beschrieben durch Eigenschaften und zulässigen Verhaltensregeln. Dabei können Gegenstände sehr einfach sein, komplexere Objekte wie Tiere oder Menschen dagegen kaum noch erfassbar.

In der Programmierung werden solche zusammen aufgeschriebenen Gebilde aus Eigenschaften und Ablaufregeln als Objekte bezeichnet. In klassischen Programmen werden Daten in Variablen gespeichert und dann durch Programmanweisungen und Funktionen Regeln vorgegeben, nach denen das Programm abläuft. Interaktion mit Schnittstellen schafft dann die Vielfalt der Abläufe. Objektorientierte Programme bestehen aus Sammlungen von Objekten.

Klassen

Die zugrundeliegende Idee ist die Zusammenfassung gleichartiger oder ähnlicher Strukturen und zusammengehörender Elemente - solche Gebilde werden als Klassen bezeichnet und in PHP mit dem Schlüsselwort "class" definiert. Es werden also nicht immer wieder Objekte definiert, wenn sie benötigt werden, sondern nur ein Mal - als Klasse. Wird dann eine Objekt benötigt, etwa um eine Programmfunktion auszulösen, so wird aus der Klasse mit "new" ein Objekt abgeleitet und dieses verwendet. Dieser Vorgang wird als "instanziieren" bezeichnet. Das Objekt ist eine "Instanz" der Klasse. Aus einer Klasse können beliebig viele Objekte abgeleitet werden. Diese sind voneinander völlig getrennt und werden für sich wiederum in Variablen gespeichert.

Vererbung

Wurde eine Klasse definiert, so wird vielleicht einmal eine Erweiterung notwendig. Vielleicht sind auch mehrere Variationen dieser Klasse möglich. Anstatt nun mehrere Klassen zu definieren, wird eine Basisklasse entworfen und daraus werden Unterklassen (Subklassen) abgeleitet, die nur die geänderten Eigenschaften und Methoden enthalten. Damit die Unterklassen überhaupt eine Funktionalität haben, müssen sie diese von einer Mutterklasse erben. Dieser Vorgang wird "Vererbung" genannt.

In PHP wird die Vererbung mit der Anweisung "extends" gesteuert. Dabei wird eine Klasse definiert und mit "extends" angegeben, von welcher Klasse zusätzliche Eigenschaften und Methoden geerbt werden. Aus Ketten solcher Verbindungen entsteht eine Hierarchie. Ebenso können Methoden überschrieben werden. Tritt in einer Klasse, die bereits Methoden geerbt hat, eine Methode gleichen Namens auf, so überschreibt diese die ursprüngliche Methode.

PHP und Objektorientierung

Eigentlich passen PHP und Objektorientierung nicht wirklich zusammen. Als Skriptsprache sind die Voraussetzungen nicht besonders günstig. Es gibt deshalb eine ganze Reihe typischer objektorientierter Eigenschaften, die in PHP unbekannt sind.

Normalerweise wird für Methoden eine einheitliche Schnittstelle definiert - es werden also Parameter und Rückgabewerte festgelegt. Tritt ein "Erbfall" auf, müssen sich diese Methoden, die andere überschreiben, an die Schnittstellendefinitionen halten. Das erzwingt einen sauberen Programmierstil. Polymorphie (Vielgestaltigkeit) erlaubt dagegen ausdrücklich - durch Angabe eines Schlüsselworts - die Veränderung der Schnittstelle in Unterklassen. PHP erlaubt das sowieso, weil Schnittstellen gar nicht definiert werden. Streng genommen unterstützt PHP Polymorphie nicht, sondern verhält sich immer so, also ob dies erlaubt wäre.

PHP5 kennt das Konzept, Variablen, Eigenschaften und Methoden vor ungewolltem ZUgriff zu schützen. KLassen stellen zwar einen eigenen Namensraum dar, Deklarationen sind also gegenüber der nicht objektorientierten Welt privat ("private"), im Innenverhältnis zu abgeleiteten Klassen gilt jedoch jedes nicht ausdrücklich anders deklarierte Mitglied als öffentlich ("public"). Um den Schutz zu verfeinern, kann ein Mitglied ausdrücklich mit "private" oder "protected" gekennzeichnet werden.

Neu in PHP 5 sind Destrukoren, die beim Vernichten des Objekts aufgerufen werden.

In PHP 5 sind Schnittstellen (engl. interfaces) neu eingeführt worden. Damit besteht die Möglichkeit, einem Benutzer einer Klasse mitzuteilen, welche der vielen öffentlichen Methoden für die Benutzung gedacht sind. Dies verfeinert den Umgang mit Bibliotheken.